在快速查找算法的此实现中,构造函数采用N
步骤,union()
也是如此。
教师说union
过于昂贵,因为N^2
处理N
union
对象上N
union
命令序列需要public class QuickFind
{
private int[] id;
public QuickFind(int N) {
id = new int[N];
for (int i=0; i<N; i++) {
id[i] = i;
}
}
public boolean connected(int p, int q) {
return id[p] == id[q];
}
public void union(int p, int q) {
int pid = id[p];
int qid = id[q];
for (int i=0; i<id.length; i++)
if (id[i] == pid)
id[i] = qid;
}
}
,如何当{one}一次访问一个数组元素时,{{1}}可以是二次的吗?
{{1}}
答案 0 :(得分:6)
每次调用union
方法都需要迭代id
数组,这需要O(n)
次。如果您调用union
方法n
次,则所需时间为n*O(n) = O(n^2)
。
通过使连接方法的时间复杂度更高,可能union
,您可以将O(1)
方法的时间复杂度提高到O(log n)
,但这只是一次操作。我相信你的教科书会详细解释这一点。
答案 1 :(得分:2)
Union
操作,快速查找的 O(n^2)
操作是二次n
,因为每次操作都需要O(n)
次,因为很容易注意到in union(int p, int q)
for (int i=0; i<id.length; i++)
请注意,该算法称为快速查找,因为每个查找(connected(int p, int q)
)操作都需要一段时间。但是,对于此算法,您最终会在union
操作中付款,如您的问题所述。
还有另一种算法 Quick Union ,可以缩短union
操作的时间。但是find
不会保持O(1)
(但优于线性时间)。