今天,由于这张幻灯片的第 13 页,我与某人讨论了 Kruskal 最小生成树算法。
该演示文稿的作者说,如果我们使用(双)链表实现不相交集,则性能为Make和Find的性能将分别为O(1)和O(1)。运算Union(u,v)的时间为min(nu,nv),其中nu和nv是存储 u 和 v 的集合的大小。
我说过我们可以通过使每个成员的表示指针指向一个包含指向集合的真实表示的指针的定位器来将Union(u,v)的时间缩短为O(1) 。
在 Java 中,数据结构如下所示:
class DisjointSet {
LinkedList<Vertex> list = new LinkedList<Vertex>(); // for holding the members, we might need it for print
static Member makeSet(Vertex v) {
Member m = new Member();
DisjointSet set = new DisjointSet();
m.set = set;
set.list.add(m);
m.vertex = v;
Locator loc = new Locator();
loc.representation = m;
m.locator = loc;
return m;
}
}
class Member {
DisjointSet set;
Locator locator;
Vertex vertex;
Member find() {
return locator.representation;
}
void union(Member u, Member v) { // assume nv is less than nu
u.set.list.append(v.set.list); // hypothetical method, append a list in O(1)
v.set = u.set;
v.locator.representation = u.locator.representation;
}
}
class Locator {
Member representation;
}
对不起,简约的代码。如果可以这样制作,那么每个不相交集操作(Make,Find,Union)的运行时间将是O(1)。但与我讨论过的人看不到改进。我想知道你对此的看法。
Find/Union 在各种实现中的最快性能是什么?我不是数据结构方面的专家,但是通过在互联网上快速浏览,我发现没有恒定时间数据结构或算法可以做到这一点。