【发布时间】:2011-03-17 23:22:08
【问题描述】:
有一个关于今天到期的作业的问题,解决方案已发布,我不明白正确答案。该问题以disjoint set forests 的形式处理不相交集的最佳情况性能,它利用加权联合算法来提高性能(较小的树的根作为子节点连接到两棵树中较大的树的根) 但没有使用路径压缩算法。
问题是在 n 个单例节点上执行 (n-1) 联合操作和 m>=n 以任何顺序查找操作的最佳情况是否是 Omega(m*logn) ,解决方案确认它是正确的,如下所示:
有一个由 n-1 个联合组成的序列 S,后跟 m >= n 个查找需要 Omega(m log n) 时间。序列 S 以序列 n-1 Unions 开始,该序列构建一棵深度为 Omega(log n) 的树。然后它有 m>=n 查找,每个查找那棵树最深的叶子,所以每个查找 (log n) 时间。
我的问题是,为什么这证明下限是 Omega(m*logn) 是正确的?这不只是一个孤立的例子,当边界是 Omega(m*logn) 并不能证明 all 输入吗?我确信在反驳一个主张时只需要展示一个反例,但需要证明 所有 个可能输入的谓词以证明其正确性。
在我的回答中,我指出了这样一个事实,当您开始将两个单例节点连接在一起时,您可能会有一个案例。然后,您将另一个单例加入到该 2 节点树中,其中 3 个节点共享同一个父节点,然后是另一个节点,等等,直到您将所有 n 个节点连接在一起。然后,您有一个树,其中 n-1 个节点都指向同一个父节点,这本质上是您使用路径压缩获得的结果。然后每个 FIND 在 O(1) 时间内执行。因此,一系列 (n-1) 个并集和 m>=n 发现最终成为 Omega(n-1+m) = Omega(n+m) = Omega(m)。
这是否意味着 Omega(m*logn) 界限不严格,因此该声明不正确?我开始怀疑我是否不完全了解 Big-O/Omega/Theta:/
编辑:把问题解决得更清楚一点
EDIT2:这是 original question 的呈现方式和 solution(我花了一点时间才意识到 Gambarino 和其他人完全是虚构的;铁杆意大利教授)
【问题讨论】:
标签: data-structures theory adt disjoint-sets