Java 联合查找二次算法是如何实现的?
在这个快速查找算法的实现中,构造函数执行Java 联合查找二次算法是如何实现的?,java,algorithm,Java,Algorithm,在这个快速查找算法的实现中,构造函数执行N步骤union() 讲师说,union太贵了,因为它需要N^2来处理Nunion对象上的N命令序列,当它一次访问一个数组元素时,union怎么可能是二次的? public class QuickFind { private int[] id; public QuickFind(int N) { id = new int[N]; for (int i=0; i<N; i++) {
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;
}
}
公共类快速查找
{
私有int[]id;
公共快速查找(int N){
id=新的整数[N];
对于(int i=0;i每次调用union
方法都需要迭代id
数组,这需要O(n)
时间。如果调用union
方法n
次,则所需时间为n*O(n)=O(n^2)
通过提高连接方法的时间复杂度,可以将union
方法的时间复杂度提高到O(1)
,可能是O(logn)
,但这只是一次性操作。我相信您的教科书会详细解释这一点。Union
快速查找的操作是二次O(n^2)
的n
操作,因为每个操作都需要O(n)
时间,在Union(int p,int q)内部的for循环中很容易注意到这一点
用于(int i=0;他是说N个联合操作的序列需要二次时间,而不是一次调用。假设您使用大小为N
的输入创建一个新的QuickFind
数据结构。最初,有N
个连接的组件,每个组件的大小为1。例如,如果您想要将所有组件统一为一个,您必须调用union
operationn-1
次。由于每个union调用取O(n),最终的复杂性为O(n^2)。通过使用路径压缩和按秩并集,可以使用O(α(n))进行并集并找到根
for (int i=0; i<id.length; i++)