用于构建Trie数据结构的Ruby代码的说明

时间:2012-01-28 02:22:55

标签: ruby irb

所以我有从维基百科中抓取的这个ruby代码,我修改了一下:

@trie = Hash.new()
def build(str)
    node = @trie
    str.each_char { |ch|
      cur = ch
      prev_node = node
      node = node[cur]
      if node == nil
        prev_node[cur] = Hash.new()
        node = prev_node[cur]
      end
    }
  end

build('dogs')

puts @trie.inspect

我首先在控制台irb上运行它,每次输出node时,它每次{}都会给我一个空哈希值,但是当我实际使用参数{{}调用该函数时1}}字符串,它确实有用,并输出'dogs',这是完全正确的。

这可能是一个Ruby问题,而不是关于算法如何工作的实际问题。我真的没有足够的Ruby知识来解读那里发生的事情。

2 个答案:

答案 0 :(得分:22)

你可能会迷失在那些混乱的代码中,这种代码采用的方法似乎更适合C ++而不是Ruby。这是一个更简洁的格式,使用特殊情况Hash进行存储:

class Trie < Hash
  def initialize
    # Ensure that this is not a special Hash by disallowing
    # initialization options.
    super
  end

  def build(string)
    string.chars.inject(self) do |h, char|
      h[char] ||= { }
    end
  end
end

它的工作方式完全相同,但是没有几乎与指针相同的混乱:

trie = Trie.new
trie.build('dogs')
puts trie.inspect

Ruby的Enumerable模块充满了非常有用的方法,如inject,这正是你想要的情况。

答案 1 :(得分:0)

我认为你只是错误地使用了irb。您应该输入整个函数,然后运行它,看看是否得到了正确的结果。如果它不起作用,你在这里发布整个IRB会话怎么样。

此处还有您的代码的简化版本:

def build(str)
  node = @trie
  str.each_char do |ch|
    node = (node[ch] ||= {})
  end
  # not sure what the return value should be
end