【问题标题】:ruby trie implementation reference issueruby trie 实现参考问题
【发布时间】:2017-07-19 10:14:31
【问题描述】:

我正在尝试在 Ruby 中实现 trie,但无法弄清楚我的 print + collect 方法存在什么问题。

我刚刚在 JS 中实现了相同的功能并且工作正常。我猜这个问题可能是 Ruby 是通过引用传递的(与 JS 不同)以及变量赋值在 Ruby 中是如何工作的。

因此,如果我在递归调用 collect 函数时以 string.clone 作为参数运行代码,那么我会得到:

["peter", "peter", "petera", "pdanny", "pdjane", "pdjanck"]

如果我通过string 那么:

["peterradannyjaneck", "peterradannyjaneck", "peterradannyjaneck", "peterradannyjaneck", "peterradannyjaneck", "peterradannyjaneck"]

任何想法如何解决这个问题?

代码:

class Node
  attr_accessor :hash, :end_node, :data

  def initialize
    @hash = {}
    @end_node = false
    @data = data
  end

  def end_node?
    end_node
  end
end

class Trie
  def initialize
    @root = Node.new
    @words = []
  end

  def add(input, data, node = @root)
    if input.empty?
      node.data = data
      node.end_node = true
    elsif node.hash.keys.include?(input[0])
      add(input[1..-1], data, node.hash[input[0]])
    else
      node.hash[input[0]] = Node.new
      add(input[1..-1], data, node.hash[input[0]])
    end
  end

  def print(node = @root)
    collect(node, '')
    @words
  end

  private

  def collect(node, string)
    if node.hash.size > 0
      for letter in node.hash.keys
        string = string.concat(letter)
        collect(node.hash[letter], string.clone)
      end

      @words << string if node.end_node?
    else
      string.length > 0 ? @words << string : nil
    end 
  end
end

trie = Trie.new
trie.add('peter', date: '1988-02-26')
trie.add('petra', date: '1977-02-12')
trie.add('danny', date: '1998-04-21')
trie.add('jane', date: '1985-05-08')
trie.add('jack', date: '1994-11-04')
trie.add('pete', date: '1977-12-18')
print trie.print

【问题讨论】:

    标签: ruby algorithm data-structures tree trie


    【解决方案1】:

    Ruby 的string concat 会改变字符串并且不返回新字符串。您可能需要+ operator。所以基本上改变collect的for循环中的2行如下:

    stringn = string + letter
    collect(node.hash[letter], stringn)
    

    另外,您可能希望在调用collect 之前始终将@words 初始化为空collect,或者将其设置为print 中的局部变量并将其传递给collect

    【讨论】:

    • 它有效。我必须同时进行更改(新变量和使用 + 运算符)。我只是单独尝试了这些解决方案。
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2014-06-30
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多