日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 实现 Trie (前缀树)

發布時間:2024/10/8 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 实现 Trie (前缀树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LeetCode:https://leetcode-cn.com/problems/implement-trie-prefix-tree/

什么是前綴樹

Trie(發音類似 “try”)或者說 前綴樹 是一種樹形數據結構,用于高效地存儲和檢索字符串數據集中的鍵。這一數據結構有相當多的應用情景,例如自動補完和拼寫檢查。

  • Trie() 初始化前綴樹對象。
  • void insert(String word) 向前綴樹中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前綴樹中,返回 true(即,在檢索之前已經插入);否則,返回 false 。
  • boolean startsWith(String prefix) 如果之前已經插入的字符串 word 的前綴之一為 prefix ,返回 true ;否則,返回 false 。

實現前綴樹

摘自:https://leetcode-cn.com/problems/implement-trie-prefix-tree/solution/208-shi-xian-trie-qian-zhui-shu-bao-gua-insert-sea/

這是一種叫做 單詞查找樹 的結構。它由字符串鍵中所有的字符構造而成,允許使用被查找鍵中的字符進行查找。其中包括插入、查找、刪除,尋找前綴等操作。接下來先介紹Trie樹的基本性質。

先看下面的例子:

現在有5個word,分別為by,by,hello,heat,the。所構成的TrieTree如圖所示,其中包含一個根節點,值為空,跟幾點所連接的是每個word的第一個字符,每個字符按照同樣的方式生成與之連接的字符的TrieTree,在每個word的最末處,表示該word出現了幾次。例如:“b”處為0,表示"b"這個單詞沒有出現過?!皔”處為2,表示“by”這個單詞出現了兩次。

單詞查找樹之所以有這樣的,是由于我們對于其結點的特殊定義。單詞查找樹的每一個節點都包含了下一個可能出現的字符的鏈接。從根節點開始,首先經過的是word的首字母所對應的鏈接,在下一個節點中沿著第二個字符所對應的鏈接繼續前進,在第二個節點中沿著第三個字符所對應的鏈接向前,這樣到達最后一個字符所指向的節點就結束。接下來我們來看對其節點的定義。

TrieNode

定義單詞查找樹的結點為:

public class TrieNode{public int path;public int end;public HashMap<Character, TrieNode> next;public TrieNode(){path = 0;end = 0;next = new HashMap<>();} }
  • path:表示當前節點所能鏈接到其他節點的個數(在刪除操作中會用到)
  • end:表示以當前節點為結尾的單詞的個數
  • next:HashMap<Character, TrieNode>類型,表示當前節點能鏈接到的所有節點。

這里next同樣可以使用字符數組來表示,例如字符的范圍是小寫字母,可以以’a’~'z’字符作為索引,這樣相比起哈希表來會提高查找速度,但每一個點都含有一個值和26個鏈接,這樣會多出好多空節點,如圖所示:

Insert 操作

如同鏈表的生成過程一樣,從根節點開始,如果根節點所連接的節點中沒有當前字符,則生成一個值為當前字符的新節點,插入其中;如果有當前字符,則則繼續進行匹配,并在過程中對每一個匹配到的節點path進行計數,重復上述過程,直到插完最后一個字符,并在最后一個字符的節點end進行計數,表示已經該單詞的插入操作已經完成。

public void insert(String word){if(word == null || word.equals("")) return ;TrieNode node = root;for(int i = 0; i<word.length(); i++){char ch = word.charAt(i);if(!node.next.containsKey(ch)) {node.next.put(ch,new TrieNode());}node = node.next.get(ch);node.path++;}node.end++; }

Search 操作

同insert操作基本相同,由于我這里使用的是Hashmap進行的節點存儲,故如果在匹配的過程中沒能匹配到,則表示搜索失敗,匹配到后最后一個字符時,如果當前end值不為零,則表示匹配成功。

public boolean search(String word){if(word == null || word.equals("")) return false;TrieNode node = root;for(int i = 0; i<word.length(); i++){char ch = word.charAt(i);if(!node.next.containsKey(ch)) return false;node = node.next.get(ch);}if(node.end == 0) return false;return true; }

startwith 操作

同search操作基本相同,只是這里判斷到最后一個字符的時候,不需要判斷end值。因為這里只需要檢查前綴是否存在。

public boolean startsWith(String word){if(word == null || word.equals("")) return false;TrieNode node = root;for(int i = 0; i<word.length(); i++){char ch = word.charAt(i);if(!node.next.containsKey(ch)) return false;node = node.next.get(ch);}return true; }

delete 操作

delete操作同上述操作大致相同,這里需要使用到path變量,回憶一下,path:表示當前節點所能鏈接到其他節點的個數。還以五個單詞為例,例如刪除’the’,當匹配到‘t’時,由于進行path–操作后,此時判斷path為0,過可直接將當前節點置空,后面的數據則不用再去遍歷即可。java中的垃圾回收機制會處理其他的被斷開的節點,如果在C++中,則需要全部匹配,之后調用析構函數去操作。

public void delete(String word){if(word == null || word.equals("") || !search(word)) return ;TrieNode node = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);if(--node.next.get(ch).path == 0){node.next.remove(ch);return;}node = node.next.get(ch);}node.end--; }

代碼

import java.util.HashMap;public class Trie {private TrieNode root;/*** Initialize your data structure here.*/public Trie() {root = new TrieNode();}/*** Inserts a word into the trie.*/public void insert(String word) {if (word == null || word.equals("")) {return;}TrieNode node = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);if (!node.next.containsKey(ch)) {node.next.put(ch, new TrieNode());}node = node.next.get(ch);node.path++;}node.end++;}/*** Returns if the word is in the trie.*/public boolean search(String word) {if (word == null || word.equals("")) {return false;}TrieNode node = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);if (!node.next.containsKey(ch)) {return false;}node = node.next.get(ch);}if (node.end == 0) {return false;}return true;}/*** Returns if there is any word in the trie that starts with the given prefix.*/public boolean startsWith(String prefix) {if (prefix == null || prefix.equals("")) {return false;}TrieNode node = root;for (int i = 0; i < prefix.length(); i++) {char ch = prefix.charAt(i);if (!node.next.containsKey(ch)) {return false;}node = node.next.get(ch);}return true;}public void delete(String word) {if (word == null || word.equals("") || !search(word)) {return;}TrieNode node = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);if (--node.next.get(ch).path == 0) {node.next.remove(ch);return;}node = node.next.get(ch);}node.end--;}public class TrieNode {public int path;public int end;public HashMap<Character, TrieNode> next;public TrieNode() {this.path = 0;this.end = 0;next = new HashMap<>();}} }/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* boolean param_2 = obj.search(word);* boolean param_3 = obj.startsWith(prefix);*/

總結

以上是生活随笔為你收集整理的Java 实现 Trie (前缀树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产又粗又硬又黄的视频 | 免费黄色小视频网站 | 在线观看亚洲精品 | 亚洲天堂美女视频 | 无码人妻丰满熟妇啪啪网站 | 91精品亚洲| 明日叶三叶 | 色综合av综合无码综合网站 | 亚洲精品嫩草 | 亚洲国产精品影院 | 91传媒在线视频 | 九九视频免费在线观看 | 亚洲乱码国产乱码精品精剪 | 国产一区二区久久 | 女裸全身无奶罩内裤内衣内裤 | 午夜免费网站 | 国产九九九九九 | 小视频免费在线观看 | 操丝袜美女视频 | 欧美成年人视频 | av色网站| 日韩一级理论片 | 综合视频 | 伊人狼人久久 | 中文字幕亚洲欧美 | 美女一级黄 | 欧美性猛交xxxx乱大交俱乐部 | 欧洲精品久久久久毛片完整版 | gav在线| 国内成人在线 | 撸啊撸在线视频 | 亚洲嫩草影院 | 国内自拍小视频 | 成人午夜免费观看 | 麻豆av一区二区三区在线观看 | 日本不卡视频一区 | 中文字幕第31页 | 色就是色av | 亚洲成人福利视频 | 美女诱惑一区 | 免费看成人av | 国产成人97精品免费看片 | 四虎在线免费 | 欧美做受视频 | 天天爽夜夜爽视频 | 成人免费网视频 | 久久国产精品无码一级毛片 | 成年人视频免费在线观看 | 久久爱伊人 | 亚洲欧美一二三区 | 裸体毛片 | 超能一家人电影免费喜剧在线观看 | av不卡一区 | 国产精品一区二区三区在线看 | 国产主播精品 | 999视频在线播放 | 五月婷婷六月激情 | 骚婷婷 | 精品伦精品一区二区三区视频密桃 | 国产精品www在线观看 | 国产成人久久77777精品 | 蜜桃av一区二区 | 国产一区二区播放 | 亚洲精华液一区二区 | 黄色激情毛片 | 爱情岛亚洲品质自拍极速福利网站 | 欧美成人精品激情在线视频 | 无码人妻aⅴ一区二区三区有奶水 | 国产无套精品一区二区 | 午夜免费看 | 免费国产精品视频 | 国产伦乱 | 蜜桃av在线免费观看 | 色一情一乱一乱一区91av | 风流少妇一区二区三区91 | 日本香蕉视频 | 毛片a区 | 免费视频一二三区 | 久久国产精品-国产精品 | 亚洲欧美日韩在线看 | 先锋av网 | 亚洲国产日韩一区无码精品久久久 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 亚洲成熟毛多妇女av毛片 | 国产在线日本 | 美丽的姑娘在线观看免费 | 18色av| 熟女丰满老熟女熟妇 | 少妇精品一区 | 日韩乱码人妻无码中文字幕久久 | 7799精品视频天天看 | 亚洲区欧美区 | 色呦呦在线免费观看 | 久久99婷婷 | wwwww国产| 日美女逼逼 | 日韩特级毛片 | 日本不卡视频一区二区 | 亚洲一区二区精品 |