Tire树的建立原理是:
利用空间换取时间,减少前缀相同的单词的匹配次数。
数据结构:
Node:{
char:当前字符
isWordEnd:单词结束标志
Map<charactor,Node>:单词下个字以及子节点
}
代码:
public class TireChTree { class Node{ public char element;//单词的当前字 boolean wordEnd;//单词结束标志 HashMap<Character, Node> childdren = null; public Node(){ this.wordEnd = false; childdren = new HashMap<Character, Node>(); } public Node(char item){ this.element = item; this.wordEnd = false; childdren = new HashMap<Character, Node>(); } } public Node root; //构造函数 public TireChTree(){ root = new Node(); } public void add(String word){ //查找重复的字符 int i = 0; Node currentNodeOld = root; //while里的条件不能顺序不能反着来 while(i < word.length() && currentNodeOld.childdren.containsKey(word.charAt(i))){ currentNodeOld = currentNodeOld.childdren.get(word.charAt(i)); i++; } if(i == word.length()){ currentNodeOld.wordEnd = true;//有更短的词进入 }else{ Node parNode = currentNodeOld; for(int j =i; j < word.length(); j++){ char cha = word.charAt(j); Node currentNodeNew = new Node(cha); parNode.childdren.put(cha, currentNodeNew); parNode = currentNodeNew; if(j == word.length()-1){ currentNodeNew.wordEnd = true; } } } } public boolean find(String word){ Node currentNode = root;//从跟节点开始 int i =0; while(i < word.length() && currentNode.childdren.containsKey(word.charAt(i))){ currentNode = currentNode.childdren.get(word.charAt(i)); i++; } if( i == word.length() && currentNode.wordEnd == true){ return true; }else{ return false; } } }测试:
public static void main(String args[]){ TireChTree tireTree =new TireChTree(); tireTree.add("春天"); tireTree.add("春天来了"); tireTree.add("夏天"); tireTree.add("秋天"); System.out.println(tireTree.find("春天")); System.out.println(tireTree.find("春天来")); System.out.println(tireTree.find("春天来了")); System.out.println(tireTree.find("春天来了吗")); System.out.println(tireTree.find("秋天")); System.out.println(tireTree.find("冬天")); }结果:
true false true false true false
测试: