精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 數據結構與算法中的字典樹,你學會了嗎?

開發 前端
在計算機科學中,字典樹(Trie)也被稱為”單詞查找樹“或”數字樹“,有時候也被稱為基數樹或前綴樹(因為可以通過前綴的方式進行索引)。—— 它是一種搜索樹,一種已排序的數據結構,通常用于存儲動態集或鍵為字符串的關聯數組。

一、前言

Trie 的歷史

字典樹 Trie 這個詞來自于 retrieval,于 1912 年,Axel Thue 首次抽象地描述了一組字符串數據結構的存放方式為 Trie 的想法。這個想法于 1960 年由 Edward Fredkin 獨立描述,并創造了 Trie 一詞。你看看,多少程序員為了一個詞、方法名、屬性名,想破腦袋!

二、字典樹數據結構

在計算機科學中,字典樹(Trie)也被稱為”單詞查找樹“或”數字樹“,有時候也被稱為基數樹或前綴樹(因為可以通過前綴的方式進行索引)。—— 它是一種搜索樹,一種已排序的數據結構,通常用于存儲動態集或鍵為字符串的關聯數組。

與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。

圖片

  • 這是一個把 battle 單詞字符串,按照字母拆分到字典樹進行存放的圖。
  • 鍵標注在節點中,值標注在節點之下。每一個完整的英文單詞對應一個特定的整數。也就是26個字母對應的 ASCII 轉換后的值。

三、字典樹結構實現

字典樹字母的存放有26個,也就是說在實現的過程中,每一個節點的分支都有26個槽位用來存放可能出現的字母組合。同理如果是數字樹的話就是10個數字的組合,每個字典樹上的節點對應的分支則有10個操作存放可能出現組合的數字。

接下來我們就基于 Java 語言實現一個字典樹的存放和遍歷索引的功能。

  • 源碼地址:https://github.com/fuzhengwei/java-algorithms
  • 本章源碼:https://github.com/fuzhengwei/java-algorithms/tree/main/data-structures/src/main/java/stack

1. 樹枝節點

public class TrieNode {

/** 形成一個鏈 */
public TrieNode[] slot = new TrieNode[26];

/** 字母 */
public char c;

/** 單詞:數量 > 0 表示一個單詞 */
public boolean isWord;

/** 前綴 */
public int prefix;

/** 單詞:具體的一個單詞字符串 */
public String word;

/** 解釋:單詞的注釋說明 */
public String explain;

}

字典的樹的節點需要包括此節點內嵌的關聯節點,之后是節點的字母、到此字母是否為單詞、單詞的前綴、單詞字符串和當前單詞的非必要注釋。

2. 插入元素

圖片

public void insert(String words, String explain) {
TrieNode root = wordsTree;
char[] chars = words.toCharArray();
for (char c : chars) {
int idx = c - 'a'; // - a 從 0 開始,參考 ASCII 碼表
if (root.slot[idx] == null) {
root.slot[idx] = new TrieNode();
}
root = root.slot[idx];
root.c = c;
root.prefix++;
}
root.explain = explain; // 單詞的注釋說明信息
root.isWord = true; // 循環拆解單詞后標記
}

insert 方法接收單詞和注釋信息,并對一個單詞按照 char 進行拆分,拆分后則計算出索引位置并以此存放。存放完成后標記單詞和附屬上單詞的注釋信息。

3. 索引元素

圖片

public List<String> searchPrefix(String prefix) {
TrieNode root = wordsTree;
char[] chars = prefix.toCharArray();
StringBuilder cache = new StringBuilder();
// 精準匹配:根據前置精準查找
for (char c : chars) {
int idx = c - 'a';
// 匹配為空
if (idx > root.slot.length || idx < 0 || root.slot[idx] == null) {
return Collections.emptyList();
}
cache.append(c);
root = root.slot[idx];
}
// 模糊匹配:根據前綴的最后一個單詞,遞歸遍歷所有的單詞
ArrayList<String> list = new ArrayList<>();
if (root.prefix != 0) {
for (int i = 0; i < root.slot.length; i++) {
if (root.slot[i] != null) {
char c = (char) (i + 'a');
collect(root.slot[i], String.valueOf(cache) + c, list, 15);
if (list.size() >= 15) {
return list;
}
}
}
}
return list;
}

protected void collect(TrieNode trieNode, String pre, List<String> queue, int resultLimit) {
// 找到單詞
if (trieNode.isWord) {
trieNode.word = pre;
// 保存檢索到的單詞到 queue
queue.add(trieNode.word + " -> " + trieNode.explain);
if (queue.size() >= resultLimit) {
return;
}
}
// 遞歸調用,查找單詞
for (int i = 0; i < trieNode.slot.length; i++) {
char c = (char) ('a' + i);
if (trieNode.slot[i] != null) {
collect(trieNode.slot[i], pre + c, queue, resultLimit);
}
}
}

從字典樹從檢索元素的過程分為2部分,第1部分是根據提供的索引前綴精準匹配到單詞信息,第2部分是根據索引前綴的最后一個單詞開始,循環遞歸遍歷從當前位置所能關聯到的字母直至判斷為是單詞標記為結束,通過這樣的方式把所有匹配動的單詞索引出來。

list.size() >= 15 是判定索引的最大長度,超過這個數量就停止索引了,畢竟這是一種O(n)時間復雜度的操作,如果加載數十萬單詞進行匹配,執行速度還是比較耗時的。

四、字典樹功能測試

@Test
public void test_trie() {
Trie trie = new Trie();
// 存入
trie.insert("bat","大廠");
trie.insert("batch", "批量");
trie.insert("bitch", "彪子");
trie.insert("battle", "戰斗");
logger.info(trie.toString());
// 檢索
List<String> trieNodes = trie.searchPrefix("ba");
logger.info("測試結果:{}", JSON.toJSONString(trieNodes));
}

這里提供一些有相近字母的單詞和名詞,用于測試。你也可以嘗試讀取txt文件,檢索存入數十萬單詞進行檢索驗證。

測試結果

06:21:38.226 [main] INFO trie.__test__.TrieTest - 測試結果:["bat -> 大廠","batch -> 批量","battle -> 戰斗"]

Process finished with exit code 0

通過測試結果可以看到,把所有以ba開頭的單詞全部檢索出來了。這也是字典樹最核心功能的體現。

讀者在學習的過程中,可以嘗試在檢索的方法體內打一些斷點看一下具體的執行過程,方便學習整個執行步驟。

責任編輯:武曉燕 來源: bugstack蟲洞棧
相關推薦

2024-01-19 08:25:38

死鎖Java通信

2024-03-28 12:20:17

2023-08-28 07:02:10

2023-09-06 11:31:24

MERGE用法SQL

2022-07-08 09:27:48

CSSIFC模型

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2024-01-11 08:21:33

Jetpack數據技術

2021-12-26 08:24:14

網關拓撲結構

2023-10-13 09:04:09

2022-12-09 09:21:10

分庫分表算法

2024-02-02 11:03:11

React數據Ref

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-26 08:24:16

Dalvik架構ART

2023-12-07 07:03:09

2024-01-18 09:38:00

Java注解JDK5

2023-01-28 09:50:17

java多線程代碼

2024-03-04 07:41:18

SpringAOPOOP?
點贊
收藏

51CTO技術棧公眾號

欧美一区二区三区日韩视频| 中文乱码免费一区二区| 亚洲18私人小影院| 中文字幕 自拍| 国产精品日本一区二区不卡视频| 亚洲午夜影视影院在线观看| 视频一区不卡| 亚洲乱码精品久久久久..| 麻豆精品网站| 美女性感视频久久久| www.久久国产| 日韩影片在线观看| 欧美亚洲尤物久久| a级黄色一级片| 成人在线视频亚洲| 久久伊人蜜桃av一区二区| 91社区国产高清| 成人毛片一区二区三区| 欧美视频四区| www.日韩av.com| 亚洲熟妇无码av| 欧洲一区在线| 欧美日韩三级一区二区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| av网站在线免费看推荐| 国产区在线观看成人精品 | 国产中文字幕乱人伦在线观看| 国自产拍在线网站网址视频| 成人免费av在线| 亚洲xxxxx性| 在线视频 中文字幕| 亚洲美女少妇无套啪啪呻吟| 欧美日韩xxx| 日本一级片免费| 色狮一区二区三区四区视频| 亚洲精品视频在线观看视频| 日韩综合第一页| 日韩精品一区二区三区中文在线| 在线不卡欧美精品一区二区三区| 色悠悠久久综合网| 二区三区不卡| 欧美日韩亚洲视频| 国产深夜男女无套内射| 福利小视频在线| 亚洲一区二区三区不卡国产欧美| 日本一区二区三区四区五区六区| 天堂中文а√在线| 国产人成一区二区三区影院| 欧美一区二区三区四区五区六区 | 9i看片成人免费看片| 亚洲手机在线| 午夜精品久久久久久久99热浪潮| 91视频综合网| 综合在线视频| 色在人av网站天堂精品| 亚洲国产精品免费在线观看| 伊人情人综合网| 欧美另类第一页| 久久久久久久国产视频| 亚洲无毛电影| 97在线观看免费高清| aaa人片在线| 美日韩精品视频| 国产精欧美一区二区三区| 欧美一级黄视频| 免费av网站大全久久| 91精品国产综合久久香蕉最新版 | 久久久加勒比| 欧美精品乱码久久久久久按摩| 污污网站免费观看| 国产精品视频一区视频二区| 欧美一区二区日韩一区二区| 日本美女视频网站| 亚洲欧洲av| 中文字幕亚洲欧美日韩高清| 免费在线观看黄色小视频| 欧美一区亚洲| 青青草原一区二区| 91成人在线免费| 国产精品自拍毛片| 精品国产第一页| 国产福利在线| 一区二区三区在线视频观看58 | 免费成人美女女在线观看| 婷婷丁香综合| 国内精品久久久久伊人av | 玖玖玖国产精品| 成人看片人aa| 午夜影院免费视频| 国产精品久久久久久久久免费丝袜 | 亚洲久久久久| 国内精品久久久久久久久| 国产91精品看黄网站在线观看| 久久精品国产精品亚洲精品| 国产一区福利视频| av电影在线观看| 亚洲一区二区av电影| 男人的天堂日韩| 清纯唯美激情亚洲| 在线视频日本亚洲性| 波多野结衣不卡视频| 视频一区欧美精品| 动漫美女被爆操久久久| 国产精品久久久久一区二区国产| 亚洲另类在线视频| 91av俱乐部| 美女av一区| 久久精视频免费在线久久完整在线看| 男人的天堂一区二区| 久久99国产精品久久99果冻传媒| 国产日本一区二区三区| 免费在线观看av片| 日韩欧美在线免费观看| 国产吃瓜黑料一区二区| 日本大胆欧美| 日本久久亚洲电影| 日韩有码第一页| 亚洲精选在线视频| 伊人成人222| 国产精品一区二区99| 国语自产精品视频在线看一大j8| 一本色道久久综合无码人妻| 久久精品夜色噜噜亚洲aⅴ| 欧美视频免费看欧美视频| 二区三区精品| 少妇av一区二区三区| 国产精品久久久久久久久久久久久久久久久| 精东粉嫩av免费一区二区三区| 欧美一区1区三区3区公司| 超碰在线cao| 精品国产青草久久久久福利| www.毛片com| 精品在线免费视频| 亚洲mv在线看| jizz久久久久久| 国产亚洲欧美aaaa| 潘金莲一级淫片aaaaaa播放| www国产精品av| 黄页网站大全在线观看| 成人台湾亚洲精品一区二区 | 精品第一国产综合精品aⅴ| 91视频免费在线看| 国产一区二区三区四区五区美女 | 成人情视频高清免费观看电影| 网友自拍视频在线| 欧美精品视频www在线观看| 秋霞网一区二区三区| 日韩av成人高清| 水蜜桃亚洲一二三四在线| 精品欧美一区二区三区在线观看| 国产午夜精品理论片a级探花| 韩国av中文字幕| 久久久久国产精品免费免费搜索| 欧美两根一起进3p做受视频| 五月国产精品| 国产极品jizzhd欧美| 69xxxx欧美| 91精品国产综合久久精品app| 登山的目的在线| 国产成人在线网站| 99热亚洲精品| 亚洲色图美女| 国产精品旅馆在线| av文字幕在线观看| 精品精品国产高清一毛片一天堂| 国产精品成人国产乱| 99久久精品久久久久久清纯| 国产又大又硬又粗| av中文字幕一区二区| 国产中文字幕日韩| 欧美黄色视屏| 亚洲色图50p| 国产精品福利电影| 亚洲成人中文在线| 蜜桃无码一区二区三区| 久久99最新地址| 成人av在线播放观看| 你懂的在线观看一区二区| 国产精品99久久久久久人| 在线看av的网址| 欧美r级在线观看| 日韩综合在线观看| 亚洲人成7777| 韩国无码一区二区三区精品| 蜜臀久久99精品久久久久久9| www.黄色网址.com| 久久a爱视频| 成人精品网站在线观看| 久久影院午夜精品| 日韩视频中文字幕| 污视频软件在线观看| 欧美日韩一区二区三区在线看| 69av视频在线| 国产亚洲短视频| 娇妻高潮浓精白浆xxⅹ| 毛片基地黄久久久久久天堂| 亚洲熟妇无码一区二区三区导航| 波多野结衣在线观看一区二区三区 | 黄色片网站在线免费观看| 国产精品免费网站在线观看| 亚洲午夜久久久久久久久| 日本亚洲天堂网| 日韩一级片免费视频| 成人羞羞网站入口| 久久精品99| 天堂av一区| 国产精品久久99久久| 国产中文在线播放| 欧美精品在线免费观看| 91女主播在线观看| 亚洲黄色有码视频| wwwav网站| 欧美日韩的一区二区| 无码人妻精品一区二区三区9厂 | 最新国产精品精品视频| 国产精品一区av| 亚洲美女炮图| 久久人人爽人人| av在线下载| 久久精视频免费在线久久完整在线看| 黄色av网站在线看| 国产视频亚洲视频| 日韩在线视频免费| 日韩欧美一区在线| 国产又粗又大又黄| 精品视频1区2区3区| 亚洲欧美一二三区| 欧美性69xxxx肥| 日韩av综合在线| 亚洲国产精品一区二区尤物区| 国产精品丝袜一区二区| 国产精品久久久久天堂| 日韩一级av毛片| 久久久久国产精品麻豆ai换脸| 日本少妇毛茸茸| 99久久精品国产导航| 日韩女优在线视频| 成人免费精品视频| 亚洲啪av永久无码精品放毛片| 国产成人综合自拍| 久久久久久无码精品人妻一区二区| 久久精品国产亚洲一区二区三区| 看欧美ab黄色大片视频免费| 日日夜夜一区二区| 国产视频手机在线播放| 日韩成人免费在线| 一本岛在线视频| 麻豆精品在线播放| 精品国产鲁一鲁一区二区三区| 久久99久久久久| 日本一二三四区视频| 国产精品99久久久| 亚洲天堂2024| 26uuu国产日韩综合| 一级黄色性视频| 欧美激情在线一区二区三区| 精品人体无码一区二区三区| 国产精品久久福利| 538任你躁在线精品视频网站| 亚洲美女在线一区| 久久久久久久9999| 色综合天天综合网天天看片| 无码无套少妇毛多18pxxxx| 在线视频欧美区| 国产精品午夜福利| 亚洲精品在线一区二区| 视频三区在线观看| 丝袜亚洲欧美日韩综合| 最新国产露脸在线观看| 久久久欧美精品| 桃花岛tv亚洲品质| 成人免费网站在线| 久久激情av| 视频一区二区在线观看| 中文av一区| 自慰无码一区二区三区| 日韩av中文字幕一区二区| av中文字幕网址| aa级大片欧美| 一级片黄色录像| 一区二区三区在线视频观看| 一本一道无码中文字幕精品热| 欧美视频一区二区三区四区| 精品国产伦一区二区三区| 亚洲精品电影久久久| av在线资源网| 久久久噜噜噜久噜久久| 欧美亚洲大片| 国产视频不卡| 久久在线视频| 欧美极品欧美精品欧美| 精品一区二区三区免费观看| 国产一线在线观看| 国产精品私人自拍| 国产成人自拍视频在线| 3751色影院一区二区三区| 天天操天天射天天舔| 爽爽爽爽爽爽爽成人免费观看| 草莓视频丝瓜在线观看丝瓜18| 国产精品久久久久久久天堂| 一本色道69色精品综合久久| 欧美亚洲一级二级| 国产精品大片| www.亚洲高清| 久久久综合网站| 欧美黑人精品一区二区不卡| 在线视频国内自拍亚洲视频| 亚洲乱熟女一区二区| 三级精品视频久久久久| 妞干网免费在线视频| 亚洲精品欧美日韩专区| 成人羞羞视频在线看网址| 欧美日本视频在线观看| 国模少妇一区二区三区| www久久久久久久| 天天影视涩香欲综合网| 精品国产免费无码久久久| 日韩亚洲欧美中文在线| 欧美成人精品三级网站| 精品国产第一页| 亚洲人成久久| 99久久综合网| 日韩一区在线看| 亚洲熟妇无码久久精品| 亚洲天堂av综合网| 涩涩涩视频在线观看| 国产亚洲欧美一区二区| 欧美日韩一卡| 男生和女生一起差差差视频| 国产精品久久精品日日| 做爰视频毛片视频| 亚洲桃花岛网站| 夜鲁夜鲁夜鲁视频在线播放| 国产视频99| 亚洲作爱视频| 亚洲av无码一区二区三区网址| 亚洲成人资源网| 日韩一级免费视频| 51ⅴ精品国产91久久久久久| 欧美国产极品| 国产精品va无码一区二区| av成人动漫在线观看| 国产一级18片视频| 亚洲精品少妇网址| 高清电影一区| 天天综合色天天综合色hd| 日本一不卡视频| 可以免费看av的网址| 在线观看91av| 伊人在我在线看导航| 999热视频在线观看| 欧美精品日韩| 漂亮人妻被黑人久久精品| 午夜精品久久久久久久久| 欧美视频免费一区二区三区| 日韩av免费在线看| 国产最新精品| 九九热免费在线观看| 夜夜操天天操亚洲| 亚洲色图21p| 国产精品热视频| 亚洲午夜精品一区二区国产| 制服下的诱惑暮生| 午夜久久电影网| 成年人视频免费在线观看| 成人h片在线播放免费网站| 综合国产在线| 亚洲第一黄色网址| 欧美亚洲高清一区| 亚洲精品白浆| 欧美成人免费在线| 蜜乳av一区二区三区| 国产精品九九九九九九| 亚洲国产精彩中文乱码av| 日本高清不卡一区二区三区视频| 亚洲国产婷婷香蕉久久久久久99| 国产美女精品人人做人人爽| 日本一级淫片色费放| 国产亚洲精品久久久久动| 精品视频一区二区三区在线观看| 日本xxxxxxxxxx75| 国产日韩欧美激情| 亚洲AV无码成人片在线观看| 欧美孕妇与黑人孕交| 亚洲精品一二三区区别| 女同毛片一区二区三区| 欧美丰满高潮xxxx喷水动漫| 1区2区在线| 亚洲精品一区二区毛豆| 成人精品免费视频| 伊人精品一区二区三区| 久久久久久久久中文字幕| 精品日韩毛片| 水蜜桃av无码| 欧美美女一区二区在线观看| аⅴ资源天堂资源库在线| 亚洲欧美日产图| 91亚洲国产成人精品一区二区三| 国产精品怡红院| 日本一欧美一欧美一亚洲视频|