我们每天百度搜索的时候,输入一个字符,搜索框下会展示前缀相似的搜索提示,这个是怎么做到的呢???
定义
- Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计,它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
- Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
基本性质
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
应用场景
- 典型应用是用于统计、排序和保存大量的字符串(不仅限于字符串),经常常用于统计、查找搜索引擎中用于分词,词频统计(TF/IDF),自动补全机制等。
图示
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起,比如我们有[‘GO’,’PHP’,’PER’,’JAVA’,’JS’,’VUE’];这个字符串集合,可以将其构建成下面这棵Trie树:
注:每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串(红色节点表示是某个单词的结束字符,但不一定都是叶子节点)。
PHP代码实现
将字符串集合构造成Trie树, 用数组存储每个结点的所有子节点
1 | class TrieNode |
运行结果
1 | 所有节点: |