Wikipedia中「Trie」条目的翻译(部分)

原文:http://en.wikipedia.org/wiki/Trie

相对于其他搜索算法的优势

不像其他算法,Trie树有着一个特别的性质:对于插入、删除以及查找操作,其代码路径,也即运行所需的时间,几乎都是相同的。因此,在这三种操作的效率都要兼顾的情况下,Trie树可以非常轻易地击败二叉查找树(BST)。同时Trie树为 CPU指令和代码分支缓存预测提供了一个更好的基础。

以下是Trie树相对于BST的主要优点:

  • 可以更快地查找关键字。查找一个长度为m的关键字在最坏情况下需要O(m)的时间。而BST需要执行O(logn)次关键字比较,其中n是树中结点的数目。这是因为BST的查找依赖于树的深度,而深度在树是平衡的情况下又是结点数目的对数。因此,最坏情况下,BST需要O(mlogn)数量的时间来完成查找。更坏的是,此时logn会接近m。同时,Trie树在查找中使用的诸如使用字符来索引数组之类的简单操作在实际机器上执行会非常快。

  • 当Trie树包含许多短的关键字,因为结点在有着公共前缀的关键字之间共享,Trie树可以更为有效地使用内存空间。

  • Trie树使得最长前缀匹配变得非常容易。

  • 从树根到叶子的路径上经历的内部结点的数目等于关键字的长度。毫无疑问,Trie树是平衡的。

以下是Trie树相对于散列表的主要优点:

  • Trie树支持有序遍历,而遍历一个散列表会使用一个由其散列函数给出的伪随机的序列(更进一步,会被散列冲突的顺序所影响,而这是由散列表的实现决定的)。

  • Trie树使得最长前缀匹配变得非常容易。但是基于上面的原因,散列表无法做到这一点。执行一个“最近匹配”查找可以像精确查找一样快,当然,这也依赖于具体实现。

  • 平均意义上,Trie树在插入上会比散列表快。这是因为散列表在快满的时候需要重建它的索引,而这是一个非常昂贵的操作。因此Trie树有着更紧凑的最坏时间界,这对于插入操作时间敏感的程序是非常重要的。

  • 因为不需要使用散列函数,对于短键值,Trie树往往要比散列表快。

应用

代替其他数据结构

如上所述,Trie树相对于BST有着许多优势。同时,因为相对于散列表有着以下优势,Trie树也会被用作替代品:

  • 相对于一个实现得不那么好的“非完美散列表”,在Trie树中查找数据最坏情况下要更快,为O(m)。“非完美散列表”会出现键冲突。一个键冲突是指散列函数将不同的关键字映射到了散列表中相同的位置。最坏情况下“非完美散列表”查找键值的时间复杂度是O(N),但这远不是平均情况,平均是O(1),主要是需要O(m)的时间来计算散列值。

  • 对于不同的关键字,Trie树不会出现冲突。

  • 对于Trie树而言,只有在一个键关联多个值的时候,类似于散列表中用于解决键冲突的“桶”才是需要的。

  • 没有必要提供一个散列函数或者更改所用的散列函数以适应越来越多的关键字被加到Trie树中。

  • Trie树可以提供一个其中所有条目根据关键字、符合字母表顺序的序列。

Trie树也有一些缺点:

  • Trie树在某些情况下查找数据时也会比散列表慢,尤其是数据时需要直接存取硬盘驱动器或者其他相对于主存而言随机存取时间非常长的第二存储设备。

  • 有些键值,例如浮点数,会带有不是那么有意义的长前缀。但是,一个位Trie树(bitwise trie)仍然能够处理标准的IEEE单精度和双精度浮点数。

字典表示

Trie 树的一个常见应用是储存一个字典。这样的应用充分利用了Trie树能够快速搜索、插入、删除条目的优势。然而,假如仅仅需要存储字典的单词,而单词附带的 其他信息不是必须的,那么一个最小循环确定有限自动机会比Trie树使用更少的空间。这是因为后者能够剪去Trie树中有着相同后缀(或者其他部分)的单 词之间相同部分所对应的“树枝”。

Trie树也非常适合用于实现模糊匹配,包括那些用于拼写检查和断字的软件。

排序

对一个关键字集执行字典排序可以通过下面这个简单的基于Trie树的算法来完成:

  1. 将所有关键字插入到一个Trie树中;

  2. 使用先根遍历输出Trie树中所有关键字,结果就是按照字典升序排列的结果。先根遍历是一种深度优先遍历,而中根遍历是另外一种深度优先遍历,不过后者更适合用于BST而不是Trie树。

这个算法是一种基数排序。

Trie树是Burstsort的基本数据结构,当前已知最快的基于内存/缓存的字符串比较算法。

全文搜索

一种特别的Trie树,被称作后缀树(suffix tree),可以用来索引一块文本中的所有后缀以实现快速全文查找。

转载于:https://my.oschina.net/u/203642/blog/192424

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值