带路径压缩的加权快速联合 - 实现

时间:2012-12-09 20:49:45

标签: algorithm data-structures union-find

我正在为union / find结构实现快速联合算法。在给定 at the "Algorithms in Java" book site 的实现中,普林斯顿实现无法在实现路径压缩时保持树的大小不变(在find()方法中)。这不应该对算法产生不利影响吗?还是我错过了什么?另外,如果我是对的,我们将如何修改大小数组呢?

1 个答案:

答案 0 :(得分:2)

除非我弄错了,否则我认为这段代码确实维护了每个树的根存储其子树中节点数的不变量。

创建数据结构时,请注意构造函数为林中的每个节点设置sz[i] = 1。这意味着值开始正确。

union 操作期间,数据结构会正确调整合并树的根的大小。因此,在任何联合操作之后,所有树根都具有正确的大小。

虽然您在查找步骤中的路径压缩期间未更新大小是正确的,但没有理由在此处数据结构会更改大小。路径压缩只会减少从某些树中的节点到树根的路径长度。它不会更改存储在该树中的节点数。因此,经历路径压缩的树的根处的大小信息不需要改变。虽然一些内部子树可能会失去一些孩子,因为它们在树中被更高层重新设置,但这是无关紧要的,因为联合/查找结构只需要在树的根部维护大小信息,而不是在内部节点。

总的来说,这意味着数据结构可以正确存储大小信息。对运行时没有不利影响,也不需要纠正任何事情。

希望这有帮助!

相关问题