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