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还是比较适合在工程中应用,尤其对于数据集比较固定的。
分享到:
相关推荐
双数组字典树(Double Array Trie,简称DAT)是一种高效的数据结构,主要用于字符串搜索和匹配,尤其在处理大量敏感词过滤的场景下表现突出。它是由日本科学家原望治(Hideo Hiraoka)提出的,相比传统的Trie树,DAT...
双数组字典树(Double Array Trie,简称DAT)是一种高效的数据结构,主要用于字符串的存储和检索。这种数据结构由日本的原田康夫提出,它在处理大量字符串数据时表现出优秀的性能,尤其在查找和前缀匹配方面。本文将...
其核心思想是通过两个数组(基数组base和检查数组check)来表示Trie树的状态转换图,从而减少内存占用。每个结点对应一个状态,状态之间的转移通过这两个数组实现。 #### 优化策略 1. **优先处理分支节点多的结点*...
Trie树(也称为前缀树或字典树)是一种用于存储具有公共前缀的字符串集合的树形数据结构。在传统的Trie树中,每个结点代表字符串中的一个字符,而路径则表示一个完整的字符串。双数组Trie树是对传统Trie树的一种改进...
为了验证优化后的双数组Trie树的有效性,研究者们设计了一系列实验来进行对比测试。这些实验包括: 1. **查询速度:** 通过比较不同索引机制下的词典查询速度,发现采用优化后的双数组Trie树算法构建的词典在查询...
双数组字典树是一种高效的字典树实现方式,它结合了矩阵形式的快速访问特性和列表形式的紧凑性,能够在保持较高查询效率的同时,显著减少内存占用。尽管插入操作相对缓慢,但对于大多数实际应用场景而言仍然足够实用...
双数组Trie(Double-ArrayTrie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一个是check[]。设数组下标为i,如果base[i],check[i]均为0,表示该位置为空。如果base[i]为负值,表示该状态为...
Trie树,又称“前缀树”或“字典树”,是一种用于存储键值对的数据结构,特别适用于字符串。它的主要特点是能以O(1)的时间复杂度进行查找、插入和删除操作(假设字符串长度为n)。Trie树通过将每个字符映射到树的...
Trie树,又称“前缀树”或“字典树”,是一种有序树,用于存储关联数组,其中的键通常是字符串。每个内部节点代表一个字符串的前缀,而叶子节点则代表完整的字符串。通过这种方式,Trie树可以快速地查找和插入字符串...
Trie树的空间复杂度原本为O(n),但Aoe和J提出的双数组Trie通过两个线性数组——base[]和check[]来优化表示,减少了空间占用并提升了查询效率。base数组代表Trie树的节点,而check数组则记录了当前状态的前一状态。...
《CQ V2.0 分词 Bates:基于双数组Tire树》 在自然语言处理领域,分词是文本分析的基础步骤,它将连续的文本序列分割成具有语义意义的词汇单元。CQ V2.0是一款采用了创新性的分词技术——基于双数组Trie树的分词...
### 二十六叉字典树知识点详解 #### 1. 二十六叉字典树简介 二十六叉字典树(Trie),也被称为前缀树或关键字树,是一种高效的数据结构,主要用于处理字符串集合。它能够有效地支持插入、删除、搜索等操作,并且...
双数组Trie树,也称为Double-Array Trie,是一种高效的字符串查找数据结构,特别适用于中文分词。它由两数组合而成,通常称为A数组和B数组,用于存储词典中的词汇。Trie树的核心思想是通过压缩路径来减少存储空间,...
### 基于双数组和PAT树算法的动态词典机制 #### 1. 引言 在自然语言处理领域,尤其是汉语的信息处理过程中,自动分词是一项基础且关键的技术。分词词典作为自动分词的核心组成部分,其性能直接影响着整个系统的...
DoubleArrayTrie 双端trie树的python实现 版本翻译于 将其改写成python3.5版本 ...在存储值很多且多有冲突、字符编码范围较大的情况下,双数组Trie树很可能在序列化到硬盘以及加载到内存的占用空间都远大于字典Trie树
在计算机科学中,Trie,也称为前缀树或字典树,是一种用于存储键值对的数据结构,它以高效的键查找速度著称。双数组 Trie(Double-Array Trie,DART)是 Trie 结构的一种优化实现,由 Hitachi 的 Hideo Bannai 和 ...
Trie,又称“前缀树”或“字典树”,是一种用于存储动态集合或关联数组的搜索树,其中每个节点代表一个字符串的前缀。双数组Trie的主要优势在于它的空间效率和查询速度,尤其是对于查找具有共同前缀的字符串。 双数...