文章目录
什么是前缀树
Trie (发音为 “try”) 或前缀树是一种树数据结构,用于检索字符串数据集中的键。这一高效的数据结构有多种应用:
1.自动补全
2.拼写检查
3.IP 路由 (最长前缀匹配)
4.打字预测
前缀树的结构
假设我们现在要做一个关于小写英文单词的前缀匹配,这个时候我们想起来可以使用我们的前缀树呀,那么什么是前缀树呢~
从一个根节点出发。每对下一个节点的映射都应该具有26种可能性(单指目前对小写英文单词的匹配的情况)。那么我们的Trie的结构是不是应该是这样的。
Class Node{
//想象一下链表结构,本来是一个对象,现在这个对象是一个26个位置的数组,用来按顺序存放26个字母
Node[] next=new Node[26];
}
请看下图
- 假设我们现在存入的是cat。root出发,在第一层当中匹配c,没有找到c,则new一个对象,并存入c。同时让一个临时节点指向当前存入的c。以此往下。
- 假设我们现在前缀树里面已经有dog了,但没有dear,我们现在要存入dear。那么我们从root出发,在第一层当中匹配d,找到了d,临时节点指向d,再去获取d中的数组,在判断是否具有e,没有找到e,则new一个新的对象存入,这个对象也带着26个位置,你只需要把e放进去,再重复往下就可以。
tip:有一种 一个节点对应26个往下的可能性 的感觉
那前缀树除了插入的功能之外,自然还有搜索的功能。比如前缀树具有boolean search(String word)的方法。那为了方便遍历完word之后,可以快速返回word是否是一个单词。我们可以对前缀树的结构进行调整,如下
Class Node{
//想象一下链表结构,本来是一个对象,现在这个对象是一个26个位置的数组,用来按顺序存放26个字母
boolean isWord=false;
Node[] next=new Node[26];
}
这样在每一个叶子节点的时候,都会对当前这个叶子节点的对象标识上一个isWord为true的属性。如下图所示吗,每一个蓝色节点的位置的对象的isWord属性都为true。
假设我们已经插入了panda,现在要插入pan这个单词,因为这个pan是panda的前缀。所以再插入完pan之后,其实在n这个节点处的对象的isWord也应该是true。即如下图所示
前缀树的数组实现(基于26个单词的)
那我们来看一下这种26个单词前缀树搜索的java实现
class Trie {
private Trie[] next=new Trie[26];
private boolean isEnd=false;
/** Initialize your data structure here. */
public Trie() {
}
/** Inserts a word into the trie. */
public void insert(String word) {
Trie root=this;
char[] c=word.toCharArray();
for(int i=0;i<c.length;i++){
if(root.next[c[i]