今天看到Trie的原理,想到以前面试遇到的一个没回答上的问题,写段代码试一下。


Trie典型应用是用于统计和排序、查询大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本的词频统计等。若关键字长度最大是5,则利用trie树,利用5次比较可以从26^5=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行 log2n 次比较。


如果想要计算词频,需要修改一下Node类。对于给定熟词表,不良词表查找文本中的单词 都可以用这个数据结构。


package algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Trie {
    private Node root=new Node();
                                                   
    public static void main(String[] args) {
        Trie trie = new Trie();
                                                       
        List<String> keyWords=new ArrayList<String>();
        keyWords.add("ca123");
        keyWords.add("mu456");
        keyWords.add("zh789");
                                                       
        trie.buildTrie(keyWords);
                                                       
        trie.search("ca123");
        trie.search("ca124");
        trie.search("mu445");
        trie.search("zh789");
    }
                                                   
    public void buildTrie(List<String> keyWords){
        for(String key:keyWords){
            Node parent=root;
            for (int i = 0; i < key.length(); i++) {
                char nodeKey=key.charAt(i);
                Node node = parent.getChildNodes().get(nodeKey);
                if (node!=null) {
                    parent=node;
                } else {
                    Node childNode = new Node();
                    parent.getChildNodes().put(nodeKey, childNode);
                    parent=childNode;
                }
            }
            parent.setValue(key);
        }
    }
                                                   
    public void search(String key){
        Node parent=root;
        for (int i = 0; i < key.length(); i++) {
            Node node = parent.getChildNodes().get(key.charAt(i));
            if (node == null) {
                System.out.println("The word "+key+" is not in dictionary");
                return;
            }
            parent=node;
        }
        System.out.println("The word "+parent.getValue()+" is in the dictionary");
    }
                                                   
}
class Node {
    private String value;
    private HashMap<Character, Node> childNodes;
                                                   
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public HashMap<Character, Node> getChildNodes() {
        if (childNodes==null) {
            childNodes=new HashMap<Character, Node>();
        }
        return childNodes;
    }
    public void setChildNodes(HashMap<Character, Node> childNodes) {
        this.childNodes = childNodes;
    }
                                                   
}