字典樹算法

一、什么是Trie?

Trie(發音為"try"),也稱為字典樹、前綴樹,是一種多叉樹結構,專門用于高效存儲和檢索字符串集合。其核心特點是共享字符串的公共前綴,從而大幅減少冗余存儲,同時加快查詢速度。

例如,存儲字符串 “apple”、“app”、“apricot” 時,Trie會共享前綴 “ap”,結構如下(簡化示意):

根節點
|
a
|
p
/ \
p   r
|   |
l   i
|   |
e  ...

二、Trie的結構

Trie的基本組成單位是節點(Node),每個節點包含:

  1. 子節點指針數組:用于指向后續字符(如存儲26個小寫字母時,數組大小為26)。
  2. 結束標志(isEnd):布爾值,標記當前節點是否為某個字符串的結尾。

根節點是特殊節點,不存儲任何字符,僅作為所有字符串的起始點。

從根節點到任意一個標記為isEnd = true的節點的路徑,構成一個完整的字符串。

三、Trie的基本操作

Trie的核心操作包括插入(insert)查找(search)前綴查詢(startsWith),三者的時間復雜度均為O(L)O(L)O(L),其中LLL是字符串的長度。

1. 插入(Insert)

目標:將字符串s插入Trie中。

步驟

  1. 從根節點開始遍歷。
  2. 對字符串s的每個字符c
  • 計算字符在數組中的索引(如 c - 'a',假設為小寫字母)。
  • 若當前節點的子節點中不存在c,則創建新節點。
  • 移動到對應子節點。
  1. 遍歷結束后,將最后一個節點的isEnd標記為true(表示該節點是字符串的結尾)。

2. 查找(Search)

目標:判斷字符串s是否在Trie中。

步驟

  1. 從根節點開始遍歷。
  2. 對字符串s的每個字符c
  • 若當前節點的子節點中不存在c,直接返回false
  • 移動到對應子節點。
  1. 遍歷結束后,返回最后一個節點的isEnd值(只有isEnd = true才表示完整字符串存在)。

3. 前綴查詢(StartsWith)

目標:判斷Trie中是否存在以字符串s為前綴的字符串。

步驟

  1. 與查找操作類似,從根節點開始遍歷每個字符。
  2. 若任何字符不存在,返回false
  3. 遍歷結束后,直接返回true(無需檢查isEnd,因為前綴本身不需要是完整字符串)。

四、時間復雜度分析

  • 插入:遍歷字符串的每個字符,時間復雜度為O(L)O(L)O(L)LLL為字符串長度)。
  • 查找:同樣遍歷每個字符,時間復雜度為O(L)O(L)O(L)
  • 前綴查詢:與查找相同,時間復雜度為O(L)O(L)O(L)

相比哈希表(平均O(1)O(1)O(1),但最壞O(N?L)O(N \cdot L)O(N?L)NNN為字符串數量),Trie在前綴匹配場景(如自動補全)中更高效,且時間復雜度更穩定。

五、C++代碼實現

1. 節點結構定義

struct TrieNode {// 子節點數組:假設只存儲小寫字母,共26個TrieNode* children[26];// 標記當前節點是否為字符串的結尾bool isEnd;// 構造函數:初始化子節點為nullptr,isEnd為falseTrieNode() {for (int i = 0; i < 26; ++i) {children[i] = nullptr;}isEnd = false;}
};

2. Trie類實現

3. 使用示例

#include <iostream>
int main() {Trie trie;// 插入字符串trie.insert("apple");trie.insert("app");// 查找測試cout << trie.search("apple") << endl;   // 輸出1(true)cout << trie.search("app") << endl;     // 輸出1(true)cout << trie.search("ap") << endl;      // 輸出0(false,不是完整字符串)// 前綴查詢測試cout << trie.startsWith("ap") << endl;  // 輸出1(true,有"apple"和"app")cout << trie.startsWith("banana") << endl;  // 輸出0(false)return 0;
}

六、Trie的應用場景

  1. 自動補全:如搜索引擎輸入前綴后提示完整內容。
  2. 拼寫檢查:判斷單詞是否存在于詞典中。
  3. IP路由:最長前綴匹配算法(Longest Prefix Matching)。
  4. 單詞游戲:如Scrabble中判斷單詞是否有效。

七、總結

Trie是一種針對字符串集合的高效數據結構,通過共享前綴實現快速插入、查找和前綴匹配。其核心優勢是:

  • 時間復雜度穩定(O(L)O(L)O(L)),不受字符串數量影響。
  • 前綴匹配能力強,適合特定場景。

缺點是空間消耗可能較大(每個節點需要存儲26個指針),但在實際應用中(如詞典、路由表),其效率優勢往往超過空間成本。

掌握Trie對于解決字符串相關的算法題(如LeetCode 208. 實現Trie)非常重要,建議結合實際題目練習加深理解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98711.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98711.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98711.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Laya使用VideoNode動態加載視頻,可以自定義播放視頻此處以及位置

export class VideoCommand {video: Laya.VideoNode;public duration: number 0;/*** param videoPos 視頻位置* param videoSize 視頻大小*/public constructor(videoPos: Laya.Vector2, videoSize: Laya.Vector2) {this.video new Laya.VideoNode;//添加到舞臺 1是場景中的…

yum localinstall安裝本地包

yum localinstall 是一個用于安裝本地 RPM 包并自動處理依賴關系的命令。當你有一個或多個本地的 RPM 包需要安裝,又希望 yum 能幫你解決可能存在的依賴問題時,這個命令就非常有用。下面我會詳細解釋它的用法和注意事項。 ??? 命令基本用法 yum localinstall 命令的基本…

LeetCode 面試經典 150 題:輪轉數組(三次翻轉法詳解 + 多解法對比)

在數組類算法題中&#xff0c;“輪轉數組” 是一道考察 “原地操作” 與 “邏輯轉換” 能力的經典題目。所謂 “輪轉”&#xff0c;是指將數組元素向右移動指定步數&#xff0c;且超出數組長度的元素需 “循環” 到數組開頭。這道題的最優解 ——三次翻轉法&#xff0c;能以 O …

網絡編程---TCP

1.TCP&#xff1a;傳輸控制協議&#xff0c;位于傳輸層2.TCP的特性&#xff1a;a.使用流式套接字&#xff0c;數據連續&#xff0c;有順序b.TCP是可靠傳輸&#xff0c;有有應答機制ACK&#xff0c;即收到數據后會明確告知發送方已收到數據&#xff1b;若發送方沒有在預計時間收…

對計算機網絡模型的理解

文章目錄 目錄 前言 一、Internet 的核心特點 二、Internet 的組成結構 1. 硬件基礎&#xff1a;網絡運行的 “物理載體” 2. 軟件支撐&#xff1a;網絡運行的 “功能橋梁” 3. 協議規則&#xff1a;網絡運行的 “通用語言” 三、OSI 七層參考模型&#xff08;理論標準&…

每日一算:分發糖果

在算法面試中&#xff0c;“分發糖果” 是一道經典的貪心算法應用題&#xff0c;核心考察對 “局部最優推導全局最優” 的理解。本文將從問題分析出發&#xff0c;提供兩種主流解題思路&#xff0c;并附上 C 實現代碼&#xff0c;幫助你徹底掌握這道題。一、問題重述題目要求有…

【WorkManager】無法在 Direct Boot 模式下初始化

【WorkManager】無法在 Direct Boot 模式下初始化一、問題描述二、問題分析2.1 關于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手動初始化 WorkManager 組件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解決方案一、問題描述 在使用 WorkManager 庫來實現開機上報…

Hybrid應用性能優化實戰分享(本文iOS 與 H5為例,安卓同理)

前言在移動應用開發中&#xff0c;Hybrid 架構因其跨平臺特性和開發效率優勢被廣泛采用。然而&#xff0c;WebView 的性能問題一直是開發者面臨的挑戰。本文將基于實際項目經驗&#xff0c;分享 iOS Hybrid 應用的核心優化策略&#xff0c;涵蓋 WebView 池化、預加載、用戶體驗…

點積、叉積、矩陣行列式詳解、線性相關與線性無關、矩陣的秩、矩陣可逆與不可逆詳解

1.向量 1.1 點積&#xff08;Dot Product&#xff09; 1.1.1 定義 點積是在求一個標量&#xff0c;點積結果沒有方向。 對于兩個向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1?,u2?,u3?),v(v1?,v2?,v3?) 點積定義為&#xff1a;u?vu1v1u…

Mac安裝nvm詳細教程(超簡單)

本章教程,主要介紹如何在Mac操作系統上安裝nvm. 我們使用官方一鍵安裝腳本,完成安裝 一、安裝步驟 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置環境變量,編輯.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到&#xff1f;從$(‘[placeholder“手機號”]’)說起總結&#xff1a;控制臺不騙人&#xff0c;元素選不到&#xff0c;八成是寫法、時機或環境的問題。我們在寫網頁自動化腳本或者調試頁面的時候&#xff0c;經常遇到一個讓人頭疼的問題&#xff1a;明明元素就在…

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們&#xff0c; 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開&#xff0c;也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile&#xff08;本機bash_profile的路徑&#xff09;加入新的環境變量格式如下&#xff08;參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言&#xff0c;用來實現自動和交互式任務進行通信&#xff0c;而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義&#xff1a;Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…

第4講 機器學習基礎概念

機器學習作為人工智能的子領域&#xff0c;專注于訓練計算機算法自動發現數據中的模式與關聯關系。以下是其核心基礎概念&#xff1a;4.1 數據數據是機器學習的基石。缺乏數據&#xff0c;算法將無從學習。數據可呈現為結構化數據&#xff08;如電子表格、數據庫&#xff09;和…

Go組合式繼承:靈活替代方案

Go 語言沒有傳統面向對象編程中的繼承機制&#xff0c;但通過組合和接口實現類似功能。Go 更提倡組合優于繼承的設計原則&#xff0c;這種設計方式更靈活且易于維護。結構體組合&#xff08;偽繼承&#xff09;通過嵌套結構體實現類似繼承的效果。子結構體可以直接訪問父結構體…

Verilog三段式FSM,實現十字路口紅綠燈

運行環境&#xff1a;VCS verdi狀態說明&#xff1a;S0 &#xff1a; 初始狀態 S1 &#xff1a; 東西方向綠燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮30周期 S2 &#xff1a; 東西方向黃燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮2 周期 S3 &#xff1a; 東西方向…

java 將pdf轉圖片

如何將pdf文件轉為圖片 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Pdf2Png {/**…

手搓Spring

目錄 兩種方法創建Spring容器 自定義Spring容器及前置操作 Spring掃描邏輯實現 createBean()方法 getBean()方法 依賴注入&#xff08;DI&#xff09; BeanNameAware接口 InitializingBean接口 BeanPostProcessor接口 AOP的實現 Spring 是一個輕量級的 Java 開發框架…

.NET 單文件程序詳解:從原理到實踐

C# 混淆加密大師在最新版本中, 提供了.NET單文件解包打包功能, 它可以快速解包官方打包的單文件程序&#xff0c;恢復為原始的多文件結構。也可以對解包后的程序集進行混淆與加密&#xff0c;有效提升逆向門檻。最后還能重新打包成單文件程序&#xff0c;保持對用戶友好的分發形…