代码之家  ›  专栏  ›  技术社区  ›  Sean Magyar

ruby trie实现参考问题

  •  0
  • Sean Magyar  · 技术社区  · 8 年前

    我试图在Ruby中实现一个trie,但无法找出我的 print collect 方法。

    我想问题可能是Ruby是通过引用传递的(不像JS),以及变量赋值在Ruby中是如何工作的。

    所以如果我用 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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   sindux    8 年前

    Ruby的 string concat 变异字符串,不返回新字符串。你可能想要 + operator

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

    此外,您可能希望始终初始化 @words 清空 print 通话前 collect 打印 并将其传递给 收集 .

    推荐文章