`
huangwei1024
  • 浏览: 8010 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

双数组字典树的内存占用测试

阅读更多

http://blog.huang-wei.com/2010/07/20/%E5%8F%8C%E6%95%B0%E7%BB%84%E5%AD%97%E5%85%B8%E6%A0%91%E7%9A%84%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%E6%B5%8B%E8%AF%95/

 

双数组字典树的内存占用测试

上一篇文章介绍了双数组字典树 DATrie,现在让我们来简单的测试下内存占用情况。

测试用例,我选了The Holy Bible,数据文件大小为4.2MB。只记录英文单词,全部转为小写。

words : 822,529

u-words : 12,591

nodes : 34,266

trie-mem : 1,247,308

datrie-mem : 483,376

Trie的实现我已经做了一些优化,初始每个节点的指针数组 size 0,当有节点插入时,再开 max(size, char) 大小的数组。trie-mem 显示的是已经除去节点自身的大小,即该数值体现的是申请的指针数组总大小。

trie-mem / ptr-size / nodes = 9.1,说明平均每个节点(内节点+叶节点)分配了9.1个指针。相对完全Trie树而言,已经节省了很多空间了。但这样算浪费的量明显是不够精确的,nodes 应该换成内节点数(这里就用 u-words 代替叶节点,虽然两者是不等同的),因为叶节点未分配指针数组,并应该减去真正有用的转移边。这个浪费的值应该是 (trie-mem / ptr-size – nodes) / (nodes – u-words) = 12.8

DATrie的浪费值应该是 (datrie-mem / (2 * int-size) – nodes) / (nodes – u-words) – 1 = 1.2,可见 DATrie 的空间复杂度还是相当不错的。当然DATrie的实现我还没有进行深入的优化,基本就是上一篇文章里的代码做的测试。如果按那文章里提到的优化方法继续优化,空间的浪费值会更低。

DATrie存在一个比较大的问题,就是它的空间是预先申请好的,因为根本无从得出它实际的大小,如果空间不够大了再重新分配的话,那势必又得消耗时间,而且还是无法解决空间是否足够的问题。另外,附加的信息域最好保存为指针的形式,否则重排时复制的复杂度就可能会很高。

总结,DATrie还是比较适合在工程中应用,尤其对于数据集比较固定的。

 

分享到:
评论

相关推荐

    双数组字典树的-java实现,用于敏感词过滤

    双数组字典树(Double Array Trie,简称DAT)是一种高效的数据结构,主要用于字符串搜索和匹配,尤其在处理大量敏感词过滤的场景下表现突出。它是由日本科学家原望治(Hideo Hiraoka)提出的,相比传统的Trie树,DAT...

    这是针对大数据集优化了的双数组字典树,使得在大数据集上构建速度也比较满意,查询速度不随数据集的增加而增加,同时解决了.zip

    双数组字典树(Double Array Trie,简称DAT)是一种高效的数据结构,主要用于字符串的存储和检索。这种数据结构由日本的原田康夫提出,它在处理大量字符串数据时表现出优秀的性能,尤其在查找和前缀匹配方面。本文将...

    基于双数组Trie_树中文分词研究

    其核心思想是通过两个数组(基数组base和检查数组check)来表示Trie树的状态转换图,从而减少内存占用。每个结点对应一个状态,状态之间的转移通过这两个数组实现。 #### 优化策略 1. **优先处理分支节点多的结点*...

    双数组Trie树算法优化及其应用研究.pdf

    Trie树(也称为前缀树或字典树)是一种用于存储具有公共前缀的字符串集合的树形数据结构。在传统的Trie树中,每个结点代表字符串中的一个字符,而路径则表示一个完整的字符串。双数组Trie树是对传统Trie树的一种改进...

    双数组Trie优化算法及其应用研究

    为了验证优化后的双数组Trie树的有效性,研究者们设计了一系列实验来进行对比测试。这些实验包括: 1. **查询速度:** 通过比较不同索引机制下的词典查询速度,发现采用优化后的双数组Trie树算法构建的词典在查询...

    an efficient implemention of double array trie

    双数组字典树是一种高效的字典树实现方式,它结合了矩阵形式的快速访问特性和列表形式的紧凑性,能够在保持较高查询效率的同时,显著减少内存占用。尽管插入操作相对缓慢,但对于大多数实际应用场景而言仍然足够实用...

    双数组 DoubleArray Trie树的数组实现 双数组字典

    双数组Trie(Double-ArrayTrie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一个是check[]。设数组下标为i,如果base[i],check[i]均为0,表示该位置为空。如果base[i]为负值,表示该状态为...

    java数组-基于java实现的双数组Trie树.zip

    Trie树,又称“前缀树”或“字典树”,是一种用于存储键值对的数据结构,特别适用于字符串。它的主要特点是能以O(1)的时间复杂度进行查找、插入和删除操作(假设字符串长度为n)。Trie树通过将每个字符映射到树的...

    DoubleArrayTrie(双数组Trie树)

    Trie树,又称“前缀树”或“字典树”,是一种有序树,用于存储关联数组,其中的键通常是字符串。每个内部节点代表一个字符串的前缀,而叶子节点则代表完整的字符串。通过这种方式,Trie树可以快速地查找和插入字符串...

    基于双数组树Trie的词典查询算法

    Trie树的空间复杂度原本为O(n),但Aoe和J提出的双数组Trie通过两个线性数组——base[]和check[]来优化表示,减少了空间占用并提升了查询效率。base数组代表Trie树的节点,而check数组则记录了当前状态的前一状态。...

    CQ V2.0分词bates(基于双数组tire树)

    《CQ V2.0 分词 Bates:基于双数组Tire树》 在自然语言处理领域,分词是文本分析的基础步骤,它将连续的文本序列分割成具有语义意义的词汇单元。CQ V2.0是一款采用了创新性的分词技术——基于双数组Trie树的分词...

    二十六叉字典树

    ### 二十六叉字典树知识点详解 #### 1. 二十六叉字典树简介 二十六叉字典树(Trie),也被称为前缀树或关键字树,是一种高效的数据结构,主要用于处理字符串集合。它能够有效地支持插入、删除、搜索等操作,并且...

    基于双数组Trie树中文分词研究_赵欢 (1)1

    双数组Trie树,也称为Double-Array Trie,是一种高效的字符串查找数据结构,特别适用于中文分词。它由两数组合而成,通常称为A数组和B数组,用于存储词典中的词汇。Trie树的核心思想是通过压缩路径来减少存储空间,...

    基于双数组和PAT 树算法的动态词典机制.pdf

    ### 基于双数组和PAT树算法的动态词典机制 #### 1. 引言 在自然语言处理领域,尤其是汉语的信息处理过程中,自动分词是一项基础且关键的技术。分词词典作为自动分词的核心组成部分,其性能直接影响着整个系统的...

    DoubleArrayTrie:双端trie树的python实现

    DoubleArrayTrie 双端trie树的python实现 版本翻译于 将其改写成python3.5版本 ...在存储值很多且多有冲突、字符编码范围较大的情况下,双数组Trie树很可能在序列化到硬盘以及加载到内存的占用空间都远大于字典Trie树

    双数组 Trie源码

    在计算机科学中,Trie,也称为前缀树或字典树,是一种用于存储键值对的数据结构,它以高效的键查找速度著称。双数组 Trie(Double-Array Trie,DART)是 Trie 结构的一种优化实现,由 Hitachi 的 Hideo Bannai 和 ...

    双数组辞典生成程序

    Trie,又称“前缀树”或“字典树”,是一种用于存储动态集合或关联数组的搜索树,其中每个节点代表一个字符串的前缀。双数组Trie的主要优势在于它的空间效率和查询速度,尤其是对于查找具有共同前缀的字符串。 双数...

Global site tag (gtag.js) - Google Analytics