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树使得最长前缀匹配变得很是容易。spa

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

如下是Trie树相对于散列表的主要优势:索引

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

  • 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),能够用来索引一块文本中的全部后缀以实现快速全文查找。

相关文章
相关标签/搜索