Tire(字典树)
程序员文章站
2022-06-07 12:45:18
...
什么是Trie
- 专门处理字符串
字典:
如果有n的条目 使用树结构 查询的时间复杂度是O(logn)
如果有100万个条目 logn大约为20
Trie
查询条目的时间复杂度 和字典中一共有多少条目无关!
时间复杂度O(W) w:查询单词的长度 优势:大多数单词长度小于10
Tire 通过Map 映射 找到 下一个 节点 比如 pan 会先找 给定p 找到 所有的下一个节点 在在所有的节点中检索 a 以此类推直到找到最后一个单词 考虑到 单词前缀 可能重复的情况 所以需要 isWord 来标注 是否是单词的结尾。
import java.util.TreeMap;
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;
}
public int getSize(){
return size;
}
public void add(String word){
Node cur = root;
for(int i = 0;i<word.length() ;i++) {
char c = word.charAt(i);
if(cur.next.get(c) == null)
cur.next.put(c, new Node());
cur = cur.next.get(c);
}
if(!cur.isWord){
cur.isWord =true;
size ++;
}
}
public Node add(Node node,String word,int i){
if( i==word.length() -1)
{
if(node.isWord==false){
node.isWord = true;
size ++;
}
return node;
}
if(node.next == null) {
node = node.next.put(word.charAt(i),new Node());
i++;
return add(node, word, i);
}
else
{
i++;
node = node.next.get(word.charAt(i));
return add(node, word, i);
}
}
public boolean contains(String word){
Node cur =root;
for(int i = 0;i<word.length();i++){
char c =word.charAt(i);
if(cur.next.get(c) == null)
return false;
cur =cur.next.get(c);
}
return cur.isWord;
}
public boolean isPrefix(String prefix){
Node cur = root;
for(int i =0;i<prefix.length();i++){
char c =prefix.charAt(i);
if(cur.next.get(c) ==null)
return false;
cur =cur.next.get(c);
}
return true;
}
}
上一篇: 字典树(tire)