【发布时间】:2012-12-28 04:01:01
【问题描述】:
我正在为联合/查找结构实现快速联合算法。在给定 at the "Algorithms in Java" book site 的实现中,普林斯顿实现在实现路径压缩(在find() 方法中)时未能保持树的大小不变性。这不应该对算法产生不利影响吗?还是我错过了什么?另外,如果我是对的,我们将如何修改 size 数组?
【问题讨论】:
标签: algorithm data-structures union-find
我正在为联合/查找结构实现快速联合算法。在给定 at the "Algorithms in Java" book site 的实现中,普林斯顿实现在实现路径压缩(在find() 方法中)时未能保持树的大小不变性。这不应该对算法产生不利影响吗?还是我错过了什么?另外,如果我是对的,我们将如何修改 size 数组?
【问题讨论】:
标签: algorithm data-structures union-find
除非我弄错了,否则我认为这段代码确实保持了每棵树的根存储其子树中的节点数的不变量。
创建数据结构时,请注意构造函数为林中的每个节点设置sz[i] = 1。这意味着值开始时是正确的。
在 union 操作期间,数据结构会正确调整合并树的根的大小。因此,在任何 union 操作之后,所有的树根都有正确的大小。
虽然您在 find 步骤中的路径压缩期间大小未更新是正确的,但数据结构没有理由在此处更改大小。路径压缩只是减少了从某些树中的节点到树根的路径长度。它不会更改存储在该树中的节点数。因此,在进行路径压缩的树的根部的大小信息不需要改变。虽然一些内部子树可能会因为它们在树中更高的位置而失去一些子树,但这无关紧要,因为联合/查找结构只需要在其树的根处维护大小信息,而不是在内部节点处。
总的来说,这意味着数据结构确实正确地存储了大小信息。对运行时间没有不利影响,也不需要纠正任何事情。
希望这会有所帮助!
【讨论】: