理解Trie:
Trie又称单词查找树,是一种树形结构,是哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
优点:非常适合操作字符串,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
缺点:虽然不同单词共享前缀,但其实trie是一个以空间换时间的算法,每个结点只存储一个字符浪费了
Trie树的一些特性:
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符,每个结点拥有26个子结点j
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同
- 如果字符的种数为n,则每个结点的出度为n,这也是空间换时间的体现,浪费了很多的空间
- 插入查找的复杂度为O(n),n为字符串长度。
Java版本1实现:
package trie;
public class Trie {
private class Node{
boolean isWord;
Node[] next = new Node[26];
public Node(boolean isWord) {
this.isWord = isWord;
}
public Node() {
this(false);
}
}
private Node root;
private int size;
public Trie() {
root = new Node();
}
//获·得Trie中存储的单词数量
public int getSize() {
return size;
}
//向Trie中添加一个单词word
public void add(String word){
Node cur = root;
for(char c : word.toCharArray()) {
if(cur.next[c - 'a'] == null)
cur.next[c - 'a'] = new Node();
cur = cur.next[c - 'a'];
}
if(!cur.isWord) {
cur.isWord