序
Trie是专门用来实现字典功能的数据结构,专门为处理字符串而实现的。与Map不同的地方在于映射的不一定是字符串。
如果字典中有n个条目,使用树结构的话,查询的时间复杂度是O(logn),随n的增大而增大。
但Trie查询每个条目的时间复杂度和字典中一共有多少条目无关!
时间复杂度为O(w),w为查询单词的长度。如果字典中有100万个词条,logn大约为20,而大多数单词的长度不足10。相比较之下,Trie树更高效。为什么Trie只与单词长度有关,原因在于Trie树存储的元素与众不同:
每个节点有若干个指向下个节点的指针,如果是英文单词的话,则要有26个指针(因为有26个字母),如果考虑大小写,则要有52个指针。因此考虑不同的情景时,需要考虑不同的指针数量。要动态地配置这个类的话,最好用Map来指定next。可以是TreeMap,也可以是HashMap。
//单词
class Node{
boolean isWord;
Map<char, Node> next;
}
代码实现
import java.util.TreeMap;
/**
* @author Nino
*/
public class Trie {
private class Node {
public boolean isWord;
public TreeMap<Character, Node> next;
public Node(boolean isWord) {
this.isWord = isWord;
next = new TreeMap<>();
}
public Node() {
this(false);
}
}
private Node root;
private int size;
public Trie() {
root = new Node();
size = 0;
}
/**
* 获取存储的单词量
* @return
*/
public int getSize() {
return size