当前位置: 首页 > 知识库问答 >
问题:

用于Trie实现的内存高效数据结构

牧甫
2023-03-14

我正在用Python实现一个Trie。到目前为止,我遇到了两种不同的方法来实现它:

char-存储字符
is_end-存储单词结尾(true或false)
prefix_count-存储具有当前前缀的单词数

class Node(object):
    def __init__(self):
        self.char = ''
        self.word = ''
        self.is_end = False
        self.prefix_count = 0
        self.child = {}

我们派生出这本词典:

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

哪一种是高效的、标准的数据结构,既能有效地存储内存,又能快速地进行字的大数据集上的遍历和其他trie操作?

共有1个答案

席烨
2023-03-14

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

class Node(object):
    def __init__(self):
        self.children = collections.defaultdict(lambda:self.__class__())
        self.stuff = ...
    def __str__(self,depth=0):
        if self.children:
            return str(self.stuff)+'\n'+'\n'.join([' '*depth+k+' ' + v.__str__(depth+1) for k,v in self.children.items()])
        else:
            return str(self.stuff)
    def get_path(self,path):
        node = self
        while path:
            node = node.children[path.pop(0)]
        ...
 类似资料:
  • 我是一个lisp初学者,我试图编写一个包,为trie定义一个类,并在其中读取拼字词典的全部内容。该结构充当一个节点,每个节点都有一个关联列表,该列表跟踪来自它的字母(导致其他子区)。 下面是我的类代码 这是我的添加单词函数 下面是打开我的文件(拼字字典)并读取每一行的函数 每当我试图加载整个字典时,都会出现堆栈溢出。拼字字典里有100k多个单词,但它在6000个时失败了……我的记忆使用情况出了问题

  • 问题内容: 我目前有一个电子表格类型程序,该程序将其数据保存在HashMaps的ArrayList中。当我告诉您这还不理想时,您无疑会感到震惊。开销似乎使用的内存比数据本身多5倍。 这个问题询问有效的馆藏库,答案是使用Google馆藏。 我的跟进是“ 哪一部分? ” 。我一直在阅读文档,但感觉不像是哪种类最适合。(我也向其他图书馆或建议开放)。 因此,我正在寻找可以使我以最小的内存开销存储密集电子

  • 问题内容: 是否有任何库或文档/链接提供了有关在Java中实现Trie数据结构的更多信息? 任何帮助将是巨大的! 谢谢。 问题答案: 您可以阅读Java Trie 或查看trie。

  • 问题内容: 我正在使用一大组 (5-20​​百万个) 字符串键 (平均长度为10个字符) ,这些键需要存储在内存中的数据结构中,该数据结构在恒定时间或接近恒定时间内支持以下操作: 就吞吐量而言,Java的Hashmap被证明是令人满意的,但占用了大量内存。我正在寻找一种内存效率高的解决方案,并且仍支持不错的吞吐量(与散列相当或几乎一样)。 我不在乎插入/删除时间。在我的应用程序中,我将仅执行插入操

  • 问题内容: 我的情况如下:我有一个数据表(少数字段,少于一百行),该数据表在程序中广泛使用。我还需要这些数据具有持久性,因此我将其另存为CSV并在启动时加载。我之所以选择不使用数据库,是因为每个选项(甚至是SQLite)对于我的卑微要求都是过高的(另外- 我希望能够以一种简单的方式离线编辑值,没有什么比记事本更简单的了)。 假设我的数据如下所示(在文件中用逗号分隔,没有标题,这只是一个示例): 笔

  • 我正在实现一个植入拼写词典的trie。trie的基本元素是一个trienode,它由一个字母部分(char)、一个标志(这个char是否是单词的最后一个char)和一个由26个指针组成的数组组成。 TrieNode类的私有部分包括: 这是测试调用的一部分: 现在,我正在尝试遍历trie以计算有多少单词(有多少标志被设置为true)。 每次函数返回0。我知道这是因为当数组中的第一个元素为null时,