1、基本概念
面试的时候被问到字典树,很久之前看过但已经不记得了,于是借此机会来复习一下。
字典树又称单词查找树或键树,是用于字符串快速查找的一种数据结构,它的形状像是一棵树,我们可以用字典树来查询字符串、查询字符串前缀、统计字符串数量。字典树插入和查询时间复杂度都为 O(k) ,其中k为字符串的长度,缺点是比较耗费空间。
2、字典树的结构
先来看下字典树长什么样,现有字符串["abc","ab","bd","dda"],则构造出的字典树如下。
从图中可以里看到,字典树的基本性质:
1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
3)每个节点的所有子节点包含的字符都不相同。
4)如果字符的种数为n,则每个结点的出度为n。
5)插入查找的复杂度为O(n),n为字符串长度。
插入过程:对于一个单词,从根开始,沿着单词的各个字母所对应的树中的节点分支向下走,直到单词遍历完,将最后的节点标记为红色,表示该单词已插入字典树。
查询过程:同样的,从根开始按照单词的字母顺序向下遍历字典树,一旦发现某个节点标记不存在或者单词遍历完成而最后的节点未标记为红色,则表示该单词不存在,若最后的节点标记为红色,表示该单词存在。
对于英文来说,字典树的出度为26(表示26个字母),字典树的数据结构如下:
typedef struct Trie_node
{
int count; // 统计单词前缀出现的次数
struct Trie_node* next[26]; // 指向各个子树的指针
bool exist; // 标记该结点处是否构成单词
}TrieNode , *Trie;
3、字典树与哈希表
哈希表可以在O(1)时间内寻找键值,但是无法高效完成:
- 找到具有相同前缀的的全部键值
- 按字典序枚举字符串的数据集
字典树优于哈希表的另一个理由:随着哈希表大小的增加,会出现大量冲突,可能最慢的时间复杂度为O(n), 其中n为插入表中键值的个数。同时,字典树在存储多个相同前缀的键时可以使用较少空间,此时Trie树只需O(m),其中m为键长。
参考:
Trie Tree(字典树/前缀树/单词查找树)www.jianshu.com