一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Trie樹(字典樹)的介紹及Java實現

Trie樹(字典樹)的介紹及Java實現

2020-08-02 12:11小樓一夜聽春雨 Java教程

Trie樹,又稱字典樹或前綴樹,關于它的結構就不詳細介紹了。Trie樹在單詞統計、前綴匹配等很多方面有很大用處。下面這篇文章主要介紹了Trie樹,以及Java實現如何Trie樹,有需要的朋友可以參考借鑒,下面來一起看看吧。

簡介

Trie樹,又稱為前綴樹或字典樹,是一種有序樹,用于保存關聯數組,其中的鍵通常是字符串。與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。

它的主要特點如下:

根節點不包含字符,除根節點外的每一個節點都只包含一個字符。

從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。

每個節點的所有子節點包含的字符都不相同。

如下是一棵典型的Trie樹:

Trie樹(字典樹)的介紹及Java實現

Trie的來源是Retrieval,它常用于前綴匹配和詞頻統計。可能有人要說了,詞頻統計簡單啊,一個hash或者一個堆就可以搞定,但問題來了,如果內存有限呢?還能這么 玩嗎?所以這里我們就可以用trie樹來壓縮下空間,因為公共前綴都是用一個節點保存的。

1、定義

這里為了簡化,只考慮了26個小寫字母。

首先是節點的定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TrieNode {
 
 public TrieNode[] children;
 
 public char data;
 
 public int freq;
 
 public TrieNode() {
 //因為有26個字母
 children = new TrieNode[26];
 freq = 0;
 }
 
}

然后是Trie樹的定義:

?
1
2
3
4
5
6
7
8
9
10
11
public class TrieTree {
 
 private TrieNode root;
 
 public TrieTree(){
 root=new TrieNode();
 }
 
 ...
 
}

2、插入

由于是26叉樹,故可通過charArray[index]-‘a';來得知字符應該放在哪個孩子中。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void insert(String word){
if(TextUtils.isEmpty(word)){
 return;
}
insertNode(root,word.toCharArray(),0);
}
 
private static void insertNode(TrieNode rootNode,char[]charArray,int index){
 
int k=charArray[index]-'a';
if(k<0||k>25){
 throw new RuntimeException("charArray[index] is not a alphabet!");
}
if(rootNode.children[k]==null){
 rootNode.children[k]=new TrieNode();
 rootNode.children[k].data=charArray[index];
}
 
if(index==charArray.length-1){
 rootNode.children[k].freq++;
 return;
}else{
 insertNode(rootNode.children[k],charArray,index+1);
}
 
}

3、移除節點

移除操作中,需要對詞頻進行減一操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void remove(String word){
if(TextUtils.isEmpty(word)){
 return;
}
remove(root,word.toCharArray(),0);
}
 
private static void remove(TrieNode rootNode,char[]charArray,int index){
int k=charArray[index]-'a';
if(k<0||k>25){
 throw new RuntimeException("charArray[index] is not a alphabet!");
}
if(rootNode.children[k]==null){
 //it means we cannot find the word in this tree
 return;
}
 
if(index==charArray.length-1&&rootNode.children[k].freq >0){
 rootNode.children[k].freq--;
}
 
remove(rootNode.children[k],charArray,index+1);
}

4、查找頻率

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int getFreq(String word){
if(TextUtils.isEmpty(word)){
 return 0;
}
return getFreq(root,word.toCharArray(),0);
}
 
private static int getFreq(TrieNode rootNode,char[]charArray,int index){
int k=charArray[index]-'a';
 if(k<0||k>25){
 throw new RuntimeException("charArray[index] is not a alphabet!");
}
//it means the word is not in the tree
if(rootNode.children[k]==null){
 return 0;
}
if(index==charArray.length-1){
 return rootNode.children[k].freq;
}
return getFreq(rootNode.children[k],charArray,index+1);
}

5、測試

測試代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static void test(){
TrieTree trieTree=new TrieTree();
String sourceStr="Democratic presumptive nominee Hillary Clintons campaign posed pounced on Trumps assertion that British term monetary turmoil might benefit his business venture in Scotland";
 
//String sourceStr="the that";
sourceStr=sourceStr.toLowerCase();
 
String[]strArray=sourceStr.split(" ");
for(String str:strArray){
 trieTree.insert(str);
}
 
 
String sourceStr2="Every president is tested by world events But Donald Trump thinks about how is his golf resort can profit from that";
sourceStr2=sourceStr2.toLowerCase();
String[]strArray2=sourceStr2.split(" ");
for(String str:strArray2){
 trieTree.insert(str);
}
 
 
 
BinaryTree.print("frequence of 'that':"+trieTree.getFreq("that"));
BinaryTree.print("\nfrequence of 'donald':"+trieTree.getFreq("donald"));
 
trieTree.remove("that");
BinaryTree.print("\nafter remove 'that' once,freq of 'that':"+trieTree.getFreq("that"));
trieTree.remove("that");
BinaryTree.print("\nafter remove 'that' twice,freq of 'that':"+trieTree.getFreq("that"));
 
trieTree.remove("donald");
BinaryTree.print("\nafter remove 'donald' once,freq of 'donald':"+trieTree.getFreq("donald"));
 
BinaryTree.reallyStartPrint();
 
 
}

測試結果如下:Trie樹(字典樹)的介紹及Java實現

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2020韩国三级理论在线观看 | 2019午夜福合集高清完整版 | 星星动漫在线观看免费 | 婷色| 88av视频在线观看 | 五月婷婷丁香在线视频 | 天天有好逼 | 免费被黄网站在观看 | 免费一级毛片在线播放 | 精品suv一区二区三区 | 91庥豆果冻天美精东蜜桃传媒 | 欧美穿高跟鞋做爰 | 国产一区精品 | 亚洲精品专区 | melody中文字幕 | 成人网免费视频 | 国产一区在线播放 | 亚洲男人天堂网址 | 久久九九有精品国产23百花影院 | 色天天综合网色鬼综合 | 青青草精品 | 99自拍网| 亚洲国产精品久久网午夜 | 欧洲另类一二三四区 | 天天视频国产精品 | 日本嫩模 | 国产在视频线在精品 | 农村美女沟厕嘘嘘被偷看 | 欧美18-19| 教室里的激情电影 | 国产精品视频第一区二区 | 亚洲AV 无码AV 中文字幕 | 久久久WWW免费人成精品 | 欧美三级一区二区 | 日韩一品在线播放视频一品免费 | 免费理伦片在线观看全网站 | 日本一区二区视频在线观看 | 国产美女久久精品香蕉69 | 免费99精品国产自在现线 | 污小说在线阅读 | 国产精品极品 |