[英]How is union find quadratic algorithm?
在快速查找算法的這個實現中,構造函數采用N
步,因此union()
。
指導者說union
太昂貴,因為它需要N^2
來處理N
對象上的N
union
命令的序列。 當一次訪問一個數組元素時, 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;
}
}
每次調用union
方法都需要迭代id
數組,這需要花費O(n)
時間。 如果你調用union
方法n
次,那么所需的時間是n*O(n) = O(n^2)
。
通過使連接方法的時間復雜度更高,可能是O(log n)
,你可以將union
方法的時間復雜度提高到O(1)
O(log n)
,但這只是一次操作。 我相信你的教科書會詳細解釋這一點。
快速查找的 Union
運算對於O(n^2)
n
運算是二次O(n^2)
,因為每個運算需要O(n)
時間,因為很容易注意到for循環內部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)
(但比線性時間更好)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.