You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quick Find算法在线连通性操作次数及复杂度符号疑问

Quick Find算法相关问题解答

实现代码

#include <stdio.h>

#define N 10000

main() {
    int i, t, p, q, id[N];

    for (i = 0; i < N; i++) 
        id[i] = i;

    printf("Input pair p q: ");

    while (scanf("%d %d", &p, &q) == 2) {
        if (id[p] == id[q])
            printf("%d %d already connected\n", p,q);
        else {
            for (t = id[p], i = 0; i < N; i++)
                if (id[i] == t)
                    id[i] = id[q];

            printf("pair %d %d not yet connected\n", p, q);
        }

        printf("Input pair p q: ");
    }
}

一、find操作次数计算

你给出的6条边分别是:12-6、2-3、0-9、5-4、3-10、10-8。在Quick Find的逻辑中,每处理一对边,都会执行2次find操作——分别读取id[p]和id[q]来判断两点是否连通,不管这对边是否已经连通。

所以总find操作次数为:6 × 2 = 12次。

二、复杂度符号的选择说明

1. 针对find操作的次数

find操作本身是O(1)的,且每对边固定对应2次find,总次数和边数k严格成正比,这种情况用**Θ(k)**最准确——因为Θ表示紧界,它能精确描述总次数和k的线性关系,既不会高估也不会低估。

2. 针对整个算法的总时间复杂度

你给出的所有边都是连接之前不连通的分量,每次union操作都需要遍历整个大小为N的id数组,总时间由k次遍历N的操作主导。这种情况下:

  • 用**Θ(kN)**是最精确的,因为每次union都确实执行了N次数组访问,总时间和kN的比例是固定的,满足紧界的定义;
  • O(kN)虽然也正确,但它只是上界,无法体现这个特定输入下时间和kN的严格线性对应关系,精度不如Θ(kN)。

如果输入中存在已经连通的边,不需要执行union遍历,那总时间只能用O(kN)描述(因为最坏情况才会达到kN量级),但你的这个输入属于最坏情况的一种,所以Θ(kN)更合适。

内容的提问来源于stack exchange,提问作者Bitwoded S.Demissie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:41:02