Trie树
Trie树:
”字典树“。它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。
Trie 树主要有两个操作:
- 将字符串的几何构造成Trie树 ;
- 在Trie树中查询一个字符串。
代码实现的原理:将字符串的值通过一个下标和字符映射的数组来存储节点的指针。将a到z这26个字母从0-25进行存储,当查找的是时候用ASCII-'a’查找匹配的子节点的指针。
public class Trie {
private TrieNode root = new TrieNode('/'); // 存储无意义字符
// 往Trie树中插入一个字符串
public void insert(char[] text) {
TrieNode p = root;
for (int i = 0; i < text.length; ++i) {
int index = text[i] - 'a';
if (p.children[index] == null) {
TrieNode newNode = new TrieNode(text[i]);
p.children[index] = newNode;
}
p = p.children[index];
}
p.isEndingChar = true;
}
// 在Trie树中查找一个字符串
public boolean find(char[] pattern) {
TrieNode p = root;
for (int i = 0; i < pattern.length; ++i) {
int index = pattern[i] - 'a';
if (p.children[index] == null) {
return false; // 不存在pattern
}
p = p.children[index];
}
if (p.isEndingChar == false) return false; // 不能完全匹配,只是前缀
else return true; // 找到pattern
}
public class TrieNode {
public char data;
public TrieNode[] children = new TrieNode[26];
public boolean isEndingChar = false;
public TrieNode(char data) {
this.data = data;
}
}
}
关键字的提示搜素功能
谷歌百度的搜素引擎,最基本的原理就是Trie 树这种数据结构。
Trie 树用于不适合精确匹配查找,对于精确查找的问题更适合用散列表或者红黑树来解决。Trie 树比较适合的是查找前缀匹配的字符串。