用于构建Trie数据结构的Ruby代码的说明
所以我有从维基百科中抓取的这个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
,它每次都会给我一个空哈希{}
,但是当我实际调用带有参数'dogs'
字符串的函数构建时,它实际上可以工作,并输出{"d"=>{"o"=>{"g"=>{"s"=>{}}}}}
,这是完全正确的。
这可能是一个Ruby问题,而不是关于算法如何工作的实际问题。 我真的没有足够的Ruby知识来破译那里发生的事情。
你可能会迷失在那些混乱的代码中,这种代码采用的方法似乎更适合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
,这正是你想要的情况。
我认为你只是错误地使用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