所以我有从维基百科中抓取的这个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知识来解读那里发生的事情。
答案 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