[數據結構]Trie字典樹

GPT的介紹

🧠 一句話總結:

字典樹是一種專門用來存很多字符串的“超級前綴樹”,查找某個字符串或前綴的時候,特別快!


?? 舉個生活例子(類比):

你想做一個詞典(Dictionary),里面有這些單詞:

apple
app
april
bat
ball
banana

你現在想知道:

  • “apple”在不在詞典里? ?
  • “app”是某個單詞的前綴嗎??
  • 有沒有以 “ba” 開頭的單詞??

如果你把這些單詞一個個拿出來比,那太慢了。

于是我們把它們塞進一個神奇的數據結構:字典樹


🌳 字典樹長啥樣?

我們用“樹”的形式來表示字符串的每個字母(從根節點一層一層往下走):

           (根)/a/p/ \p   r/     \l       i/         \e           l另一邊:b/   \a     a/       \l         n/           \l             a\n\a

每個節點代表一個字母,每條路徑代表一個字符串

每個節點有cnt,表示以這個節點為結尾的字符串的個數


🚀 字典樹的速度怎么樣?

  • 普通查找(字符串在數組里)時間是:O(字符串長度 × 數組長度)
  • 字典樹查找時間是:O(字符串長度),和多少單詞沒關系!

💡 形象一點說:

  • 數組/哈希表:像是一頁一頁翻字典
  • 字典樹:像是按字母順序直接走向目標

就像 Google 搜索你輸入 "ap",它能秒給你推薦 "apple"、"app store"、"april" —— 這背后可能就是字典樹!


🧩 總結一張圖:

"apple", "app", "april" ==> 共享前綴 "ap"↓
Trie 就是把這些前綴共享,像搭積木一樣拼起來↓
節省空間 + 查詢高效

模板

N一般開到2e5+10就足夠了

0表示根節點 不存任何字符 是空節點

  • Trie 根節點永遠不表示任何字母,根節點只是一顆“無名的樹根”
  • 它是連接所有字母的“共同出發點”
  • 它不存任何字符,也不是任何單詞的一部分

++idx表示給當前字符分配編號

     	[根0]/    \a        b↓        ↓p        a↓        ↓p        n↓        ↓l        a↓        ↓e        n↓a
const int N = 1e5 + 10; // 最大節點數(字符串數量×平均長度)
int son[N][26];        // 每個節點的26個子節點(用下標表示)
int cnt[N];             // cnt[i] 表示以 i 號節點結尾的單詞個數
int idx = 0;            // 當前用到的節點編號(0 是根)// 插入字符串
void insert(const string &s) {int p = 0;for (char c : s) {int u = c - 'a';if (!son[p][u]) son[p][u] = ++idx; // 創建新節點p = son[p][u];}cnt[p]++; // 這個節點是一個完整單詞的結尾
}
// 查詢字典樹中插入了幾個s
int query(const string& s) {int p = 0;for (int i = 0; i < s.size(); ++i) {int u = s[i] - 'a';if (son[p][u] == 0) {return 0;}p = son[p][u];}return cnt[p];
}

查詢是否存在以prefix 為前綴的字符串

bool startsWith(string prefix) {int p=0;for(auto c:prefix){int u=c-'a';if(son[p][u]==0) return 0;p=son[p][u];}return 1;   
}

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

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

相關文章

04-算法打卡-數組-二分查找-leetcode(69)-第四天

1 題目地址 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09;69. x 的平方根 - 給你一個非負整數 x &#xff0c;計算并返回 x 的 算術平方根 。由于返回類型是整數&#xff0c;結果只保留 整數部分 &#xff0c;小數部分將被 舍去 。注意&#xff1a;不允許使用任何內…

AI領域再突破,永洪科技榮獲“2025人工智能+創新案例”獎

在2025年的今天&#xff0c;人工智能已從技術概念全面滲透至產業核心。中國作為全球AI技術應用的前沿陣地&#xff0c;正通過“人工智能”行動加速推進技術與實體經濟深度融合。 這一背景下&#xff0c;永洪科技憑借其“國內某頭部ICT人力資源板塊GenAI項目”榮獲“2025全國企業…

反序列化漏洞介紹與挖掘指南

目錄 反序列化漏洞介紹與挖掘指南 一、漏洞核心原理與危害 二、漏洞成因與常見場景 1. 漏洞根源 2. 高危場景 三、漏洞挖掘方法論 1. 靜態分析 2. 動態測試 3. 利用鏈構造 四、防御與修復策略 1. 代碼層防護 2. 架構優化 3. 運維實踐 五、工具與資源推薦 總結 反…

從零開始的C++編程 2(類和對象下)

目錄 1.構造函數初始化列表 2.類型轉換 3.static成員 4.友元 5.內部類 6.匿名對象 1.構造函數初始化列表 ①之前我們實現構造函數時&#xff0c;初始化成員變量主要使?函數體內賦值&#xff0c;構造函數初始化還有?種?式&#xff0c;就是初始化列表&#xff0c;初始化…

Profibus DP主站轉ModbusTCP網關通訊秘籍

Profibus DP主站轉ModbusTCP網關通訊秘籍 在現代工業自動化領域&#xff0c;不同設備間的數據通訊和系統集成至關重要。Profibus DP和Modbus TCP是兩種廣泛應用的工業通信協議&#xff0c;各有其獨特的優勢和適用場景。然而&#xff0c;由于歷史原因或設備制造商的差異&#x…

【力扣hot100題】(092)最長回文串

有點難度&#xff0c;一開始想到的兩種方法都不對&#xff0c;花了不少時間。 先說之前的方法&#xff1a; ① 遍歷每個點&#xff0c;每個點向外擴張&#xff0c;如果左等于右就一直擴展直到不等。 這個方法可是可以&#xff0c;但我沒有考慮到兩個相同字母也是回文串的情況…

14 - VDMA彩條顯示實驗

文章目錄 1 實驗任務2 系統框圖3 硬件設計4 軟件設計 1 實驗任務 本實驗任務是PS端寫彩條數據至DDR3內存中&#xff0c;然后通過PL端的VDMA IP核將彩條數據通過HDMI接口輸出顯示。 2 系統框圖 本實驗是用HDMI接口固定輸出1080P的彩條圖&#xff0c;所以&#xff1a; rgb2lc…

HarmonyOS-ArkUIV2裝飾器-@Param:組件外部輸入

上文我們了解了@Local裝飾器 ,講明了Local裝飾器不允許外部傳入值對其進行初始化。詳見: HarmonyOS-ArkUI V2裝飾器@Local裝飾器:組件內部狀態-CSDN博客。 但總有場景是需要外部組件傳值過來,然后本組件接收這個值這種場景的。而且很多情況下,一個狀態變量的作用范圍會是…

Java從入門到“放棄”(精通)之旅——運算符③

&#x1f31f;Java從入門到“放棄”&#xff08;精通&#xff09;之旅&#x1f680;&#xff1a;運算符深度解析 引言&#xff1a;運算符的本質與價值 作為Java語言的核心組成部分&#xff0c;運算符是構建程序邏輯的基礎元素。它們不僅僅是簡單的數學符號&#xff0c;更是程…

【sgSpliter】自定義組件:可調整寬度、高度、折疊的分割線

sgSpliter.vue <template><!-- 注意&#xff1a;父組件position必須是relative、absolute或fixed&#xff0c;不建議直接在綁定:data后面用"{屬性}"&#xff0c;建議單獨在script中聲明data&#xff0c;避免拖拽過程重復調用 --><div :class"$…

Ningx負載均衡

Ningx負載均衡 upstream(上游)配置負載均衡1、weight&#xff08;加權輪詢&#xff09;2、ip_hash&#xff08;負載均衡&#xff09;3、url hash負載均衡4、least_conn&#xff08;最小連接負載均衡&#xff09; upstream(上游)配置負載均衡 Nginx負載均衡 參考: nginx從安裝…

一個插件,免費使用所有頂級大模型(Deepseek,Gpt,Grok,Gemini)

DeepSider是一款集成于瀏覽器側邊欄的AI對話工具&#xff0c;可免費使用所有頂級大模型 包括GPT-4o&#xff0c;Grok3,Claude 3.5 Sonnet,Claude 3.7,Gemini 2.0&#xff0c;Deepseek R1滿血版等 以極簡交互與超快的響應速度&#xff0c;完成AI搜索、實時問答、內容創作、翻譯、…

眾趣科技丨數字孿生技術,賦能交通公共設施管理數字化升級

春節假期期間&#xff08;1 月 21 日至 2 月 4 日&#xff09;&#xff0c;作為中國春節申遺成功后的首個春運&#xff0c;交通出行格外火熱&#xff0c;全社會跨區域流動量超 23 億人次&#xff0c;這一數據創下了歷史新高。 面對如此龐大的客流量&#xff0c;傳統的交通管理方…

Linux 入門五:Makefile—— 從手動編譯到工程自動化的蛻變

一、概述&#xff1a;Makefile—— 工程編譯的 “智能指揮官” 1. 為什么需要 Makefile&#xff1f; 手動編譯的痛點&#xff1a;當工程包含數十個源文件時&#xff0c;每次修改都需重復輸入冗長的編譯命令&#xff08;如gcc file1.c file2.c -o app&#xff09;&#xff0c;…

Python-Django+vue二手電子設備交易平臺功能說明

?(^_-) 上千個精美定制模板,各類成品Java、Python、PHP、Android畢設項目,歡迎咨詢。 ?(^_-) 程序開發、技術解答、代碼講解、文檔,??文末獲取源碼+數據庫+文檔?? ??軟件下載 | 實戰案例 ??文章底部二維碼,可以聯系獲取軟件下載鏈接,及項目演示視頻。 本項目…

數據庫管理工具實戰:IDEA 與 DBeaver 連接 TDengine(二)

五、DBeaver 連接 TDengine 實戰 5.1 安裝 DBeaver 下載安裝包&#xff1a;訪問 DBeaver 官方網站&#xff08;https://dbeaver.io/download/ &#xff09;&#xff0c;根據你的操作系統選擇合適的安裝包。如果是 Windows 系統&#xff0c;下載.exe 格式的安裝文件&#xff1…

Spring Boot接口返回Long類型的數據時丟失精度的全局處理

1、問題 當實體類中的字段為Long類型時&#xff0c;通過Ajax請求返回給前段&#xff0c;在js中數據會丟失精度 直接通過postman請求或通過瀏覽器請求&#xff0c;看下響應則不會丟失精度 2、處理方式 1、使用JsonSerialize注解 JsonSerialize(using ToStringSerializer.…

英偉達Llama-3.1-Nemotron-Ultra-253B-v1語言模型論文快讀:FFN Fusion

FFN Fusion: Rethinking Sequential Computation in Large Language Models 代表模型&#xff1a;Llama-3.1-Nemotron-Ultra-253B-v1 1. 摘要 本文介紹了一種名為 FFN Fusion 的架構優化技術&#xff0c;旨在通過識別和利用自然并行化機會來減少大型語言模型&#xff08;LLM…

Django學習記錄-1

Django學習記錄-1 雖然網上教程都很多&#xff0c;但是感覺自己記錄一下才屬于自己&#xff0c;之后想找也方面一點&#xff0c;文采不佳看的不爽可繞道。 參考貼 從零開始的Django框架入門到實戰教程(內含實戰實例) - 01 創建項目與app、加入靜態文件、模板語法介紹&#xff…

Python爬蟲第7節-requests庫的高級用法

目錄 前言 一、文件上傳 二、Cookies 三、會話維持 四、SSL證書驗證 五、代理設置 六、超時設置 七、身份認證 八、Prepared Request 前言 上一節&#xff0c;我們認識了requests庫的基本用法&#xff0c;像發起GET、POST請求&#xff0c;以及了解Response對象是什么。…