一种trie树 的实现方式

Trie树,又被称为前缀树。

它查询的基本原理是通过当前字的下一个字定位到其子节点。如果我们限制所有有效的输入仅是普通的英文字母,那么它最多会有52个子节点。我之前见过的一种做法就是一旦插入产生第一个子节点, 所有52个节点会同时生成。这种做法的好处是查询速度非常快, 因为直接通过输入的字符就直接可以定位到子节点。缺陷也非常的明显, 即是上述的应用场景都会造成严重的空间浪费.。如果我们把字符集加大到所有汉字, 那么这个空间浪费将是承受不起的。

另一种建树的思路可以解决上述结构造成空间浪费的问题,
思路如下。所有的节点按照一定的顺序保存到一维数组中, 每个节点保存其第一个子节点在该一维数组中的位置(也可以是和当前节点的偏移量), 同时保存子节点的个数。知道子节点的位置便可以将其直接定位到, 知道子节点的个数我们就可以通过遍历来确定查询词是否在Trie树中。这样的实现在查询时间上会稍微逊色于前一种,但是其空间利用率是非常高效的。

通常的一种应用是找到以某个查询串为前缀的所有成词。具体的实现可以是深度优先查找和广度优先查找。广度优先查找是需要一个临时的数组来保存扫描到的节点的所有子结点,这样如果数据量大时会消耗掉一定的内存。深度优先查找也需要一个临时变量保存当前节点已经扫描过的子节点数,其性能应该较优于广度有限查找,只是代码会难写一些。

建树的过程比较复杂。其基本思路是按层建树。需要的一个重要的临时变量是记录每一个词中的每一个字所成的词(比如词是‘笑猫日记’,扫描到‘猫’时所成的词是‘笑猫’)在一维数组中的位置。之所以需要这个信息,是我们扫描的其子节点时,才会去填写偏移量和子节点个数的信息。扫描时,如果发现当前字的前一个字和前面一个词当前字(层级都是n)的前一个字不同时,可以通过那个临时变量定位到以前一个字成词在一维数组中的位置,填写该节点的子节点数为1,偏移量为当前一维数组的大小减去上面的位置数;否则子节点数加一。如果当前字和扫面的前一个词的当前字不同,我们需要把以当前字所成的词放入一维数组中去,并记录相关临时变量的值。

时间: 2024-10-16 04:46:28

一种trie树 的实现方式的相关文章

bloom filter与dawgdic(一种trie树)

我有一个做了一款移动浏览器的朋友. 他有这样一个需求:当用户输入一个网站的url时候,移动浏览器需要识别这个网址是否是一个恶意网址.另外,他有一个恶意网址库. 也许这样的解决方法有多种. 其中一种就是把恶意网址库放在本地,移动浏览器拿到一个网址的时候就把它与网址库中的每个地址匹配一下,根据匹配与否来判断网址的是否为一个恶意地址. 哦,我忘了补充的情况就是这个网址库中有150万条数据,压缩后23M,如果一个浏览器为了识别恶意网址这么一个功能而附加这么大的库,你会没有用户的. 我刚开始给出的解决方法

信息检索——初识Trie树

1.概述 Trie树( /tri:/ ),又称前缀树.字典树,是种快速检索的多叉树结构, Trie树的基本性质可以归纳为: (1)根节点不包含字符,除根节点意外每个节点只包含一个字符. (2)从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串. (3)每个节点的所有子节点包含的字符串不相同. 2.Trie基本实现 基本操作包括插入.删除.查找等. 考虑到通常用于字典等内存较大的情况,应该加入序列化,分割等操作. 3.应用 接触这一数据结构是因为分词处理中的字典存储问题,对这一问

【bzoj1174】[Balkan2007]Toponyms Trie树

题目描述 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. 输入 第一行给出数字N.N在[2,1000000] 下面N行描述这些字符串,长度不超过20000 .保证输入文件不超过10MB 输出 a single line with an integer representing the maximal level of complexity Lc(T). 样例输入 7 Jora de Sus Orhei Jora de Mijloc

[搜索]Trie树的一种实现

trie树也叫字典树,搜索树等. 如图所示 下面是用stl 的map来实现 class trie_item_c { public: trie_item_c(){} trie_item_c(const char nm) { name = nm; } void set_name(const char nm) { name = nm; } trie_item_c * get_child(const char nm) { map<const char ,trie_item_c*>::const_ite

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

Trie树详解(转)

特别声明 本文只是一篇笔记类的文章,所以不存在什么抄袭之类的. 以下为我研究时参考过的链接(有很多,这里我只列出我记得的): Trie(字典树)的应用--查找联系人 trie树 Trie树:应用于统计和排序 牛人源码,研究代码来源 1.字典树的概念 字典树,因为它的搜索快捷的特性被单词搜索系统使用,故又称单词查找树.它是一种树形结构的数据结构.之所以快速,是因为它用空间代替了速度. 2.字典树的特点: 字典树有三个基本性质: 1.根节点不包含字符,除根节点外每一个节点都只包含一个字符2.从根节点

B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接