Trie字典樹的一個實現

今天看到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;
    }
                                                   
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章