【发布时间】:2012-01-28 02:22:55
【问题描述】:
所以我有这个从 wikipedia 抓取的 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 知识来破译那里发生的事情。
【问题讨论】:
-
“每次我输出节点”是什么意思?不确定您在寻找什么样的答案——您是否在纸上追踪了一个小字符串的算法?很短。
-
我在输入 node = prev_node['a'] 后在控制台上输入了 'node',然后它返回类似 => {} 的东西,这意味着哈希到空对象,然后我输入 node = node['b'],尝试通过传入不同的字符作为键来模拟 for 循环。当我在那之后再次输入'node'时,它当然返回nil。我只是想知道当我每次跟踪它时它如何产生 {"d"=>{"o"=>{"g"=>{"s"=>{}}}}} 时,它看起来总是空的
-
我仍然建议用一张纸来跟踪算法,跟踪每一步并写下所有变量的值。特别注意
prev_node[cur] = Hash.new,并考虑prev_node[cur]是什么——但请记住prev_node本身是一个带有字符键的散列,它恰好指向一个空散列(对于一次迭代)。 -
我不明白你的问题是什么。