我如何找出我的逻辑缺陷?

时间:2013-08-25 19:54:48

标签: ruby find union nodes

我无法弄清楚我的逻辑缺陷。

34的父级,83的父级。我希望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]

感谢任何帮助。

2 个答案:

答案 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

有很多方法可以实现这一点,我发现这是最简单的(因为辅助函数已经到位)