Prefix tree, Tries, Patricia tree, Suffix trees

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BigFatSheep/article/details/80677789

Prefix tree

给一个word和一个words的list,L。判断W是否在L中。用一棵根结点是word的前缀的前缀树来表示。每个节点向下的时候如果字符不同,则分成多个子节点。一棵树可以表示一组words。

Trie树

因为prefix tree含有大量的冗余,令每一个节点存储一个字典来表示字符,也称为digital search tree。

Trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
Trie可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。

为了防止有单词是别的单词的前缀,使用过一个结束符号“$”

Trie的应用

(1) 自动补全
例如,你在百度搜索的输入框中,输入一个单词的前半部分,它能够自动补全出可能的单词结果。
(2) 拼写检查
例如,在word中输入一个拼写错误的单词, 它能够自动检测出来。
(3) IP路由表
在IP路由表中进行路由匹配时, 要按照最长匹配前缀的原则进行匹配。
(4) T9预测文本
在大多手机输入法中, 都会用9格的那种输入法. 这个输入法能够根据用户在9格上的输入,自动匹配出可能的单词。
(5) 填单词游戏
相信大多数人都玩过那种在横竖的格子里填单词的游戏。

Trie的优点

还有其他几种数据结构,如平衡树和哈希表,它们可以在字符串数据集中搜索一个单词。那为什么我们还需要trie?
虽然哈希表在查找某个关键字时有 O 1 的时间复杂度,但以下操作效率不高:

用共同的前缀查找所有的键。
以字典顺序列举字符串数据集。
trie优于哈希表的另一个原因是,随着哈希表的大小增加,会有很多哈希冲突,搜索时间复杂度可能会恶化到 O n ,其中n是插入的f关键字的数量。当存储具有相同前缀的多个关键字时,Trie可以使用比哈希表少的空间。在这种情况下,使用trie只有 O m 时间复杂度,其中m是关键字长度。而在平衡树中查找关键字的时间复杂度为 O m l o g n

Trie的时间复杂度

插入和搜索都是O(m)的,m位关键字长度。
创建是O(the sum of the lengths of all the stored words)) = O(input size)
同理,空间复杂度也是上面的值。

Patricia trie(compressed trie)

将trie数中所有的单个子节点合并起来形成压缩trie树,又名Patricia Trie。

如果一颗Trie中有很多单词只有一个儿子结点,可以用Patricia Trie(Linux内核中叫做Radix Tree)压缩存储。由于#结束符标记被看作是一个叶子结点,那么一颗Patricia Trie的任何内部结点有2个或以上的孩子结点。

Patricia Trie的基本操作包括:插入、删除和查询。插入操作可能会涉及到split(拆分),删除操作可能会涉及到merge(合并)。基于Patricia Trie的基本性质,split和merge操作都是局部的,这样实现起来比较简单。

在搜索时,要匹配一条边上的所有字符。

Suffix Tree

后缀树是一个储存了string S所有后缀的trie树,一般用于对文本的操作。对于未压缩的suffix tree,最长的路径就是原本的string,编号为0。一共会有0-n共n+1条不同的路径。同样的,suffix tree也可以compress

后缀树的查找效率为O(m) m为需要查找的串的长度,主流的后缀树构造算法有两种时间复杂度,一种是构建是基于O(n^2)时间复杂度的暴力构造,求出所有的后缀,然后构造trie树,然后压缩。当然对于时间要求和数据量小的情况这种完全也可以,另外一种是非常出名的线性时间构造也就是UKKonen的加速构造。

Compacted Suffix Trees

不存储具体的字符,而是存储从string的index开始k个字符的集合。Store[startingposition,length],节省了存储空间。

suffix tree时间复杂度。

空间复杂度O(number of words)

查询:O(m) m 为查找的串的长度。

构造时间:For many years, the best suffix tree construction time was
O(n log |σ|). Here n is the input length, and |σ| is the size of the alphabet.

但是Farach算法可以Build a suffix tree in O(n) time

猜你喜欢

转载自blog.csdn.net/BigFatSheep/article/details/80677789