又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
可以用指针或者静态数组实现
指针实现:
public class TrieNode {
public int path;
public int end;
public TrieNode[] map;
public TrieNode() {
path = 0;
end = 0;
map = new TrieNode[26];// 26个字母
}
}
public void insert(String word) {
if (word == null)
return;
TrieNode node = root;
node.path++;
char[] words = word.toCharArray();
int index = 0;
for (int i = 0; i < words.length; i++) {
index = words[i] - 'a';
if (node.map[index] == null) {
node.map[index] = new TrieNode();
}
node = node.map[index];
node.path++;
}
node.end++;
}
public boolean search(String word) {
if (word == null)
return false;
TrieNode node = root;
char[] words = word.toCharArray();
int index = 0;
for (int i = 0; i < words.length; i++) {
index = words[i] - 'a';
if (node.map[index] == null)
return false;
node = node.map[index];
}
return node.end > 0;
}
数组实现:
class Node {
int[] ch = new int[26];
int flag;
public Node() {
flag = -1;
}
}
public void insert(String s, int id) {
int len = s.length(), add = 0;
for (int i = 0; i < len; i++) {
int x = s.charAt(i) - 'a';
if (tree.get(add).ch[x] == 0) {
tree.add(new Node());
tree.get(add).ch[x] = tree.size() - 1;
}
add = tree.get(add).ch[x];
}
tree.get(add).flag = id;
}
public int findWord(String s, int left, int right) {
int add = 0;
for (int i = right; i >= left; i--) {
int x = s.charAt(i) - 'a';
if (tree.get(add).ch[x] == 0) {
return -1;
}
add = tree.get(add).ch[x];
}
return tree.get(add).flag;
}