内存Trie Implementation的高效数据结构

时间:2015-04-19 18:46:34

标签: python data-structures tree nlp trie

我在python中实现了一个Trie。到目前为止,我已经遇到了两种不同的方法来实现它:

  1. 使用一个类Node(类似于C ++中的struct Node)和数据成员 -
  2.   

    char - 存储角色

         

    is_end - 存储单词结尾(true或false)

         

    prefix_count - 存储具有当前前缀

    的单词数      

    child - 节点类型dict(用于存储其他节点,即26个字母)

    class Node(object):
        def __init__(self):
            self.char = ''
            self.word = ''
            self.is_end = False
            self.prefix_count = 0
            self.child = {}
    
    1. 使用字典存储所有数据。
    2.   

      words = {'foo', 'bar', 'baz', 'barz'}

             {'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}},
              'z': {'_end_': '_end_'}}},
              'f': {'o': {'o': {'_end_': '_end_'}}}}
      

      哪个是高效且标准的数据结构,对于大词汇数据集上的遍历和其他trie操作,内存效率高,速度快?

3 个答案:

答案 0 :(得分:1)

为什么不两者兼而有之?就在昨天,我正在实现一个类似的数据结构,用于存储和检索对象的层次结构,并考虑了这种确切的情况。使用带有子字典的Node对象结束。 作为对象的主节点允许您使用自定义方法进行打印或获取内容,如果需要,您甚至可以进行延迟初始化(您提到了大数据集吗?)

    if(sortRunner == 1) {               
           int swap; 
           for(int i = 0; i < list.length - 1; i++) {
               for(int j = 0; j < list.length - i -1; j++){             
                    if(list[j] > list[j+1]){
                        swap = list[j];
                        list[j] = list[j+1];
                        list[j+1] = swap;
                    }
                    System.out.print(list[j]);
                }
System.out.println();
             }
             System.out.print("\nThe bubble sort from the numbers are: ");
             for (int k = 0; k < list.length; k++){
                System.out.print(list[k] + " ");
             }
             System.out.println();
         } // End bubble sorting here

答案 1 :(得分:1)

直接替换将嵌套list;

然而[可以说]更多Pythonic,更紧凑的内存,因此更快的查找将是嵌套tuple

当然,更新这样的trie会变成logN,因为你必须重新创建每个祖先节点。但是,如果您的查找比更新频繁得多,那么它可能是值得的。

答案 2 :(得分:-3)

Trie在空间复杂性方面失败了。 Trie倾向于使用大量内存进行处理和操作。但是为了避免这个问题,有一种数据结构被称为简洁的数据结构。试着在这里实现。

有关详细信息,请参阅here