精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品无码人妻一区二区在线| 欧美诱惑福利视频| 亚洲成人av免费观看| av毛片在线免费| av一区二区不卡| 国产精品久久不能| 免费在线观看黄视频| 嫩草国产精品入口| 欧美日韩国产区一| 毛片av在线播放| 免费看男男www网站入口在线| 久久精品国产网站| 午夜精品美女自拍福到在线| 国产视频123区| 国产成人澳门| 欧美久久高跟鞋激| 国产91在线免费| 精品孕妇一区二区三区| 26uuu国产一区二区三区| 国产在线视频不卡| 99久热在线精品996热是什么| 成人a'v在线播放| 精品国产91乱码一区二区三区| 日韩一级在线免费观看| av毛片在线看| 国产精品久久久久久久浪潮网站| 国产亚洲一区在线播放| 国产又粗又猛又黄| 久久精品女人| 国内揄拍国内精品少妇国语| 免费黄色国产视频| 精品一区毛片| 精品国产91九色蝌蚪| 污污的视频免费观看| 午夜精品成人av| 亚洲国产成人av| 午夜在线视频免费观看| 国产系列在线观看| 91亚洲男人天堂| 成人性色av| 国产免费无遮挡| 奇米色一区二区三区四区| 91av在线视频观看| www.天天色| 欧美日韩1080p| 一本色道久久综合狠狠躁篇的优点| 亚洲啪av永久无码精品放毛片| 四虎精品在线观看| 欧美日韩一区二区三区在线 | 欧美在线精品免播放器视频| 免费三片在线播放| 欧美暴力喷水在线| 久久精品一区中文字幕| 免费成年人视频在线观看| 色综合久久一区二区三区| 国产亚洲欧洲在线| 国产破处视频在线观看| 青草国产精品| 中文字幕精品在线| 九九热久久免费视频| 波多野结衣一区| 中文字幕亚洲欧美日韩在线不卡 | 91激情视频在线| 在线看黄色av| 国产精品视频在线看| 视频在线99re| 日本免费中文字幕在线| 一区二区中文视频| 婷婷视频在线播放| 女人天堂av在线播放| 亚洲韩国一区二区三区| 日韩中文字幕在线免费| 在线观看福利电影| 欧美中文字幕一区二区三区亚洲| 亚洲成人av免费看| 亚洲午夜剧场| 91精品国产色综合久久ai换脸 | 精品国产成人系列| 菠萝菠萝蜜网站| 久久不卡国产精品一区二区| 一区二区亚洲精品国产| 少妇高潮在线观看| 欧美精品一卡| 午夜精品99久久免费| 精品人妻无码一区二区性色| 男女男精品视频网| 51国偷自产一区二区三区的来源| www.久久色| 99久久99久久精品免费看蜜桃| 精品中文字幕一区| 高清av电影在线观看| 亚洲欧洲日产国码二区| 国产精品69久久久| 欧美性xxx| 91精品欧美综合在线观看最新| 岛国精品一区二区三区| 免费看成人哺乳视频网站| www.久久色.com| 久久精品国产亚洲AV无码男同 | 国产欧美日韩视频在线| 久久精品人人爽| 圆产精品久久久久久久久久久| 丝袜亚洲另类欧美| 99久久精品久久久久久ai换脸| 色婷婷av一区二区三| 中文一区一区三区高中清不卡| 久久久久亚洲av无码专区喷水| 福利影院在线看| 欧美日韩国产综合视频在线观看| 亚洲成人福利视频| 精品久久久中文字幕| 欧美激情在线播放| 中文字幕一区二区久久人妻| 成人一区二区三区视频| 性欧美.com| 高清精品在线| 日韩一卡二卡三卡| 久久精品三级视频| 中文欧美日韩| 97久草视频| 成年人在线观看视频| 亚洲国产一区在线观看| 欧美在线aaa| 亚洲欧洲免费| 久久久久久69| 国产精品久久久久久免费免熟| 91麻豆精东视频| 国产欧美精品aaaaaa片| 日本午夜免费一区二区| 亚洲男人第一网站| 久久国产视频播放| 成人丝袜高跟foot| 波多野结衣与黑人| 不卡一区视频| 日韩有码视频在线| 欧美三级网站在线观看| 久久久久国产精品厨房| 波多野结衣乳巨码无在线| 白嫩白嫩国产精品| 欧美精品在线播放| 国产精品一区二区三区在线免费观看 | 国产精品久久影视| 国产日韩三级在线| 日本一本二本在线观看| 琪琪久久久久日韩精品| 久久99热这里只有精品国产| 国产乱色精品成人免费视频| 欧美高清一级片在线观看| mm1313亚洲国产精品无码试看| 欧美国产极品| 97香蕉久久超级碰碰高清版| 懂色av成人一区二区三区| 一区二区三区欧美日| 日韩欧美在线播放| 手机免费av片| 人人狠狠综合久久亚洲婷婷| 国产精品aaa| 国产午夜在线视频| 在线精品视频一区二区三四| 免费看污片网站| 久热re这里精品视频在线6| 欧洲精品亚洲精品| 国产成人毛片| 精品国产区一区二区三区在线观看| 18国产免费视频| 国产精品天美传媒沈樵| 91视频这里只有精品| 婷婷久久国产对白刺激五月99| 国产欧美精品va在线观看| 日本亚洲精品| 日韩欧美综合一区| 日本少妇毛茸茸高潮| 91在线精品一区二区| 国产真实乱子伦| 国产亚洲电影| 国产精品久久久久久久美男| 天天在线视频色| 91精品国产综合久久久蜜臀粉嫩| tube国产麻豆| 成人h动漫精品一区二区| 日本久久久精品视频| 日韩精品免费一区二区三区| 91精品综合视频| 国产黄色大片在线观看| 亚洲免费电影一区| 亚洲影视一区二区| 一区二区高清在线| 波多野结衣一本| 美国十次了思思久久精品导航 | 国产精品一区二区久久久久| 麻豆tv在线| 亚洲第一区第一页| 免费一级a毛片| 亚洲视频免费在线观看| 日批在线观看视频| 另类的小说在线视频另类成人小视频在线 | 日韩在线观看精品| 亚洲不卡免费视频| 色乱码一区二区三区88| 欧美肥妇bbwbbw| 99久久久精品| 日韩va在线观看| 日韩亚洲国产欧美| 一区精品在线| 牛牛影视久久网| 成人妇女淫片aaaa视频| 国产高潮在线| 久久精品这里热有精品| 嫩草在线播放| 精品三级在线看| 中文字幕欧美人妻精品| 激情成人在线视频| 91精品国产闺蜜国产在线闺蜜| 91在线精品一区二区| 宇都宫紫苑在线播放| 日本亚洲欧美天堂免费| 极品粉嫩国产18尤物| 亚洲第一偷拍| 偷拍视频一区二区| 秋霞综合在线视频| 不卡视频一区二区三区| 九七影院97影院理论片久久| 91国产美女在线观看| aa在线视频| 中文字幕亚洲天堂| 瑟瑟在线观看| 精品乱人伦小说| 国产精品欧美激情在线| 在线免费观看日韩欧美| av中文在线播放| 悠悠色在线精品| 99热99这里只有精品| 国产欧美一区二区精品秋霞影院| 久久久久亚洲AV成人无码国产| 国产乱码精品一区二区三区av| 我要看一级黄色大片| 天堂久久一区二区三区| 国产精品秘入口18禁麻豆免会员| 欧美日韩18| 97av中文字幕| 亚洲mv大片欧洲mv大片| 在线免费一区| 日韩在线高清| 一区不卡视频| 成人黄色小视频| 日本一区视频在线观看免费| 婷婷成人在线| 欧美二区在线| 自拍亚洲一区| 欧美一二三区| 国产成人手机高清在线观看网站| 久久精品国产综合精品| 欧美午夜寂寞| 麻豆精品视频| 欧美热在线视频精品999| 欧美亚洲另类在线一区二区三区| 日韩有码中文字幕在线| 欧美高清视频一区| 精品久久久久久久| 一本一道久久a久久综合精品| 欧美色图国产精品| 亚洲成人1区2区| 久久人妻少妇嫩草av蜜桃| 东方aⅴ免费观看久久av| 大乳护士喂奶hd| 91视频xxxx| 一级黄色性视频| 国产精品色噜噜| 久久久久久视频| 亚洲一区二区三区在线| 精品小视频在线观看| 精品日本高清在线播放| 在线免费观看av网址| 欧美日韩和欧美的一区二区| 国产成人麻豆精品午夜在线 | 日日干夜夜操s8| 国产尤物一区二区在线| 精品一区二区三区四区五区六区| 99精品视频在线免费观看| 少妇精品一区二区三区| 国产女主播视频一区二区| 久久噜噜色综合一区二区| 亚洲午夜久久久久久久久电影院| 波多野结衣国产| 欧美吞精做爰啪啪高潮| 99国产精品久久久久久久成人| 亚洲电影成人av99爱色| 久草在线网址| 久久视频在线直播| 免费毛片b在线观看| 国产精品久久久久久影视| 久久久国产精品入口麻豆| 精品在线观看一区二区| 99久久婷婷这里只有精品| 青青在线视频免费观看| 久久综合亚州| 国产乱淫av麻豆国产免费| 久久精品欧美日韩精品| 极品久久久久久| 欧美性猛交xxxx免费看漫画| 国产精品毛片久久久久久久av| 亚洲第一区在线观看| 91在线视频| 97久久精品在线| 成人日韩视频| 欧美日韩亚洲综合一区二区三区激情在线 | 美女尤物在线视频| 国产精品91免费在线| 波多野结衣欧美| 亚洲一区二区三区精品在线观看| 欧美激情性爽国产精品17p| 黄色一级大片在线观看| 成人午夜大片免费观看| 婷婷丁香综合网| 欧美午夜激情在线| 后进极品白嫩翘臀在线视频 | 色在线视频网| 国产精品国语对白| 欧美交a欧美精品喷水| 影音先锋成人资源网站| 日本vs亚洲vs韩国一区三区二区| 折磨小男生性器羞耻的故事| 国产精品超碰97尤物18| 国产精品第5页| 亚洲激情成人网| 日本aa在线| 成人亚洲激情网| 欧美久久精品一级c片| 亚洲 自拍 另类小说综合图区| 国产自产v一区二区三区c| 性欧美精品男男| 福利视频第一区| 欧美一级性视频| 欧美xxxx综合视频| 国产精品毛片aⅴ一区二区三区| 日韩久久在线| 丝袜亚洲另类欧美| 亚洲欧美色图视频| 亚洲福利视频导航| www.亚洲天堂.com| 欧美成人精品三级在线观看| 亚洲成人毛片| 亚洲一区二区三区加勒比| 日本欧美加勒比视频| av网站免费在线看| 91福利在线看| 理论视频在线| 日韩美女视频免费看| 亚洲日产av中文字幕| 成熟了的熟妇毛茸茸| 91一区二区在线| 亚洲午夜18毛片在线看| 亚洲国语精品自产拍在线观看| 色爱综合区网| 成人动漫在线视频| 欧美色综合网| 欧美xxxxx精品| 欧美日韩免费在线| 你懂的在线视频| 国产精品7m视频| 久久国产电影| 一级黄色片在线免费观看| 亚洲色图欧美偷拍| 国产成a人亚洲精v品无码| 久久99视频免费| 欧美美女在线直播| 欧美三级午夜理伦三级| 久久精品人人爽人人爽| 夜夜狠狠擅视频| 精品国产视频在线| 亚洲精品福利| 亚洲午夜无码av毛片久久| 国产亚洲精品精华液| 91亚洲精品国偷拍自产在线观看 | av香蕉成人| 高清av免费一区中文字幕| 亚洲精品女人| 色婷婷在线影院| 欧美日韩亚洲丝袜制服| 成人在线播放免费观看| 国产精品xxxx| 久久影院亚洲| 一区二区国产精品精华液| 日韩免费视频一区| 自拍偷拍亚洲视频| 亚洲精品高清国产一线久久| 精品在线观看免费| 国产一级片免费| 亚洲性线免费观看视频成熟| 久久精品xxxxx| 成人在线国产视频| 国产婷婷一区二区| 国产激情久久久久久熟女老人av| 亚洲国产一区二区视频| 天堂在线精品视频| 一区二区国产盗摄色噜噜| 国产高清av在线| 99视频在线播放| 日韩av网站在线观看| 免费毛片在线播放免费|