我无法弄清楚我的逻辑缺陷。
3
是4
的父级,8
是3
的父级。我希望9
指向4
的{{1}}的根。
这是我的Ruby课程:
8
这是测试文件:
class QuickUnion
def initialize(n)
@id = Array.new(n) {|i| i}
end
def root(i)
while i != @id[i] do
i = @id[i]
end
i
end
def connected?(p, q)
root(p) == root(q)
end
def union(p, q)
@id[p] = @id[q]
end
def print_union
puts "#{@id}"
end
end
这是输出:
qu = QuickUnion.new(10)
qu.print_union
qu.union(4,3)
qu.print_union
qu.union(3,8)
qu.print_union
qu.union(6,5)
qu.print_union
qu.union(9,4)
qu.print_union
最后一个数组的输出应为:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 3, 5, 6, 7, 8, 9]
[0, 1, 2, 8, 3, 5, 6, 7, 8, 9]
[0, 1, 2, 8, 3, 5, 5, 7, 8, 9]
[0, 1, 2, 8, 3, 5, 5, 7, 8, 3]
感谢任何帮助。
答案 0 :(得分:1)
union(9,4)
正在分配@id[9] = @id[4] = 3
。
在ruby中,数组的索引从0开始,而不是1。
答案 1 :(得分:1)
将union方法替换为以下内容:
def union(p, q)
@id[p] = root(@id[q])
end
有很多方法可以实现这一点,我发现这是最简单的(因为辅助函数已经到位)