【发布时间】:2017-08-19 13:24:08
【问题描述】:
我正在参加有关数据结构和算法的 coursera 课程。作者提到快速查找是 O(N^2),这是有道理的(假设对 N 个对象的 N 个联合操作可能需要 N*N 数组访问)。但是,我不明白为什么 Quick Union 会更好。似乎在最坏的情况下,一棵狭长的树,对 N 个对象的 N Find 操作也会导致 O(N^2),但材料说它是 O(N)。
所以,一个是二次时间,一个是线性时间。我不确定我是否理解为什么会有差异。示例:
快速查找方法
int[] id = new int[10];
for(int i = 0; i < 10; i++)
id[i] = i;
// Quick find approach
int QuickFind(int p)
{
return id[p];
}
public void Union(int p, int q)
{
int pId = find(p);
int qId = find(q);
if (pId == qId)
return;
for (int i = 0; i < id.length; i++)
{
if(id[i] == pId)
id[i] = qId;
}
}
快速联合方法
int Find(int p)
{
while(p != id[p])
p = id[p];
return p;
}
void QuickUnion(int p, int q)
{
int pRoot = Find(p);
int qRoot = Find(q);
if(pRoot == qRoot)
return;
id[pRoot] = qRoot;
}
【问题讨论】:
-
通常在联合查找数据结构中,会在根中存储一个等级,并且通过将较小等级的根嫁接到较高的根上来执行联合 - 这可以防止长窄树。如果您提供一段简短的代码摘录来演示您正在谈论的内容,以及您认为是 O(N^2) 的特定案例,您的问题会更好。然后有一些具体的答案。
-
Quick Union 实际上会导致
O(N)查找操作。我认为教科书可能指的是单个查找操作。
标签: algorithm quick-union