Trie简介#
Trie又称字典树,用于压缩存储字符串。
下面是存储了字符串"apple", "append", "file" 的 Trie
graph TB root((root))--> 1((a)) 1((a))--> 2((p)) 2((p))--> 3((p)) 3((p)) --> 4((l)) 4((l))--> 5((e)) 3((p)) --> 6((e)) 6((e)) --> 7((n)) 7((n)) --> 8((d)) root((root))--> f((f)) f((f)) --> i((i)) i((i)) --> l((l)) l((l)) --> e((e))
引入结束符#
如果两个单词,其中一个是另一个的前缀,应该如何表示?例如“Maria”和“Mariana”。 为了解决这个问题,几乎所有的Trie都引入一个特定的结束符来标记结束,例如"."
优点#
- 有时空间效率高:存储大量拥有相同前缀的单词。
- 高效前缀查找, 如:
- 统计拥有"app"前缀的单词有多少个?
- 前缀"strawber"中下一个最可能出现的字符是什么?
缺点#
- 通常空间效率低下:每个ASCII字符仅需1bytes存储空间, 连接Trie各结点的是指针 -- 64位系统下需要8bytes
- 不是标准库:鲜有语言实现了built-in Trie,需要我们自己实现
Trie C语言版实现#
NEED TO DO LATER
Radix Trees基数树 --- 空间优化的Trie#
Radix Trees是空间优化的Trie, 假如树中的一个节点是父节点的唯一子节点(the only child)的话,那么该子节点将会与父节点进行合并。 不像是一般的trie树,radix tree的边沿(edges)可以是一个或者多个元素。
下面是存储了字符串"apple", "append", "file" 的 Radix Trees
graph TB root((root))--> 1((app)) 1((app))--> 2((le)) 1((app))--> 3((end)) root((root))--> file((file))
reference#
1.Trie Data Structure 2.Trie | (Insert and Search) 3.数据结构之Radix Tree