union如何找到二次算法?

时间:2014-06-16 12:28:26

标签: java algorithm

在快速查找算法的此实现中,构造函数采用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}}

2 个答案:

答案 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循环
    for (int i=0; i<id.length; i++)

请注意,该算法称为快速查找,因为每个查找(connected(int p, int q))操作都需要一段时间。但是,对于此算法,您最终会在union操作中付款,如您的问题所述。

还有另一种算法 Quick Union ,可以缩短union操作的时间。但是find不会保持O(1)(但优于线性时间)。