【高級數據結構】Trie樹

原理

介紹

高效地存儲和查詢字符串的數據結構。所以其重點在于:存儲、查詢兩個操作。

存儲操作

示例和圖片來自:https://blog.csdn.net/qq_42024195/article/details/88364485

假設有這么幾個字符串:b,abc,abd,bcd,abcd,efg,hii。最終存儲出來的Trie圖如下圖所示:

在這里插入圖片描述
具體是怎么存的呢?對于每一個字符串,從樹的根節點開始,依次判斷當前節點的兒子節點中是否有當前字符:

  • 如果有,則進行下一個字符的判斷,同時根節點更新為該兒子節點
  • 如果沒有,創建一個兒子節點為當前字符,然后根節點更新為該兒子節點

如果已經到了最后一個字符,就在對應的兒子節點進行一個標記,表示從根節點到該節點的字符組成的字符串是一個單詞。(對應圖中的紅色部分)

查詢

查詢和存儲的操作類似。對于一個給定的字符串,從樹的根節點開始,依次判斷當前節點的兒子節點中是否有當前字符:

  • 如果有,則進行下一個字符的判斷,同時根節點更新為該兒子節點
  • 如果沒有,則說明不存在該字符串,直接返回不存在

復雜度

時間復雜度:O(max_len(s))=O(h),h為Trie樹的高度,即最長字符串的長度。

空間復雜度:不超過O(N * max_len(s))。

代碼實現

208. 實現 Trie (前綴樹)

class Trie {private Trie[] children; // 當前節點的所有兒子private boolean isEnd; // 當前節點是否為一個單詞的結尾public Trie() {children = new Trie[26]; // 假設字符串中都是小寫字母,那么一個節點的所有兒子最多只有26個isEnd = false;}/**存儲操作:插入一個字符串*/public void insert(String word) {Trie node = this; // 從根節點開始for(char c : word.toCharArray()) {int u = c - 'a'; // [a, z] -> [0, 25]if (node.children[u] == null) { // 當前節點node不存在兒子節點 node.children[u] = new Trie(); // 創建一個節點為當前字符} node = node.children[u]; // 更新根節點為兒子節點}node.isEnd = true;}/**查詢操作:查詢某個字符串是否在樹中。如果在樹中,可以是樹中單詞的前綴,也可以是完整的單詞*/private Trie searchPrefix(String prefix) {Trie node = this; // 從根節點開始for(char c : prefix.toCharArray()) {int u = c - 'a'; // [a, z] -> [0, 25]if (node.children[u] == null) { // 當前節點node不存在兒子節點 return null;} node = node.children[u]; // 走到兒子節點}return node;}public boolean search(String word) {// 查詢樹中是否存在完整的單詞Trie node = searchPrefix(word);return node != null && node.isEnd;}public boolean startsWith(String prefix) {// 查詢樹中是否存在某個前綴return searchPrefix(prefix) != null;}
}/*** 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);*/

當然,Trie樹也可以查詢存儲并查詢一個單詞出現了幾次,只需要把isEnd改成cnt就行。當cnt為0時,表示沒出現過,即不是一個完整的單詞;當cnt > 0時,表示出現過,cnt的大小即為出現的次數。

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

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

相關文章

Vue中如何實現條件渲染?

在Vue中實現條件渲染非常簡單且靈活&#xff0c;主要通過Vue的指令來實現。在Vue中&#xff0c;我們可以使用v-if和v-else指令來根據條件來渲染不同的內容。下面就讓我們通過一個簡單的示例來演示如何在Vue中實現條件渲染&#xff1a; <!DOCTYPE html> <html lang&qu…

GO泛型相關

通過引入 類型形參 和 類型實參 這兩個概念&#xff0c;我們讓一個函數獲得了處理多種不同類型數據的能力&#xff0c;這種編程方式被稱為 泛型編程。 2. Go的泛型 類型形參 (Type parameter)類型實參(Type argument)類型形參列表( Type parameter list)類型約束(Type constr…

Pake 輕松構建輕量級多端桌面應用

Pake 利用 Rust 輕松構建輕量級多端桌面應用&#xff0c;支持 Mac / Windows / Linux。 小白用戶&#xff1a;可以使用 「常用包下載」 方式來體驗 Pake 的能力&#xff0c;也可試試 Action 方式。 開發用戶&#xff1a;可以使用 「命令行一鍵打包」&#xff0c;對 Mac 比較友…

Matlab 機器人工具箱 動力學

文章目錄 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload官網:Robotics Toolbox - Peter Corke R.dyn 查看動力學參數 mdl_puma560; p560.dyn;%查看puma560機械臂所有連桿的動力學參數 p560.dyn(2);%查看puma560機械臂第二連桿的動力學參數 p560.links(2)…

react父子組件傳參demo

父組件代碼 /* eslint-disable next/next/no-img-element */ "use client"; import React, { useEffect, useState } from "react"; import WxTip from ../components/WxTipconst Download () > {const [showTip, setshowTip] useState<boolean…

javaweb day9 day10

昨天序號標錯了 vue的組件庫Elent 快速入門 寫法 常見組件 復制粘貼 打包部署

高斯消元法解線性方程組

高斯消元法 基本性質&#xff1a; 把某一行乘一個非 0 0 0的數 (方程的兩邊同時乘上一個非 0 0 0數不改變方程的解) 交換某兩行 (交換兩個方程的位置) 把某行的若干倍加到另一行上去 &#xff08;把一個方程的若干倍加到另一個方程上去&#xff09; 算法步驟 枚舉每一列c …

洛谷p1225 c++(使用高精度)

題解: 一開始我這個代碼想到的是使用遞歸來求解 int digui(int n){int sum=0;if(n==1)sum=1;if(n==2)sum=2;if(n==1||n==2)return sum;if(n>2){return sum+=digui(n-1)+digui(n-2);} } 但是后面發現明顯超時,我試圖用記憶化搜索來搶救一下,所以就有了下面代碼 int di…

圖論 - DFS深度優先遍歷、BFS廣度優先遍歷、拓撲排序

文章目錄 前言Part 1&#xff1a;DFS&#xff08;深度優先遍歷&#xff09;一、排列數字1.題目描述輸入格式輸出格式數據范圍輸入樣例輸出樣例 2.算法 二、n皇后問題1.問題描述輸入格式輸出格式數據范圍輸入樣例輸出樣例 2.算法 三、樹的重心1.問題描述輸入格式輸出格式數據范圍…

計算機二級Python刷題筆記------基本操作題23、33、35、37(考察字符串)

文章目錄 第二十三題&#xff08;字符串替換&#xff1a;replace(old,new)&#xff09;第三十三題&#xff08;字符串遍歷&#xff09;第三十五題&#xff08;字符串與列表&#xff09;第三十七題&#xff08;拼接字符串&#xff09; 第二十三題&#xff08;字符串替換&#xf…

第19章-IPv6基礎

1. IPv4的缺陷 2. IPv6的優勢 3. 地址格式 3.1 格式 3.2 長度 4. 地址書寫壓縮 4.1 段內前導0壓縮 4.2 全0段壓縮 4.3 例子1 4.4 例子 5. 網段劃分 5.1 前綴 5.2 接口標識符 5.3 前綴長度 5.4 地址規模分類 6. 地址分類 6.1 單播地址 6.2 組播地址 6.3 任播地址 6.4 例子 …

Redis學習------實戰篇----2024/02/29----緩存穿透,雪崩,擊穿

1.緩存穿透 Overridepublic Result queryById(Long id) {//1.從redis中查詢緩存String key CACHE_SHOP_KEY id;String shopJson stringRedisTemplate.opsForValue().get(key);//2.判斷是否存在//3.存在則直接返回if (StrUtil.isNotBlank(shopJson)){Shop shop JSONUtil.toB…

每日一題 2867統計樹中的合法路徑

2867. 統計樹中的合法路徑數目 題目描述&#xff1a; 給你一棵 n 個節點的無向樹&#xff0c;節點編號為 1 到 n 。給你一個整數 n 和一個長度為 n - 1 的二維整數數組 edges &#xff0c;其中 edges[i] [ui, vi] 表示節點 ui 和 vi 在樹中有一條邊。 請你返回樹中的 合法路…

Nginx 反向代理入門教程

Nginx 反向代理入門教程 一、什么是反向代理 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服務器來接受Internet上的連接請求&#xff0c;然后將請求轉發給內部網絡上的服務器&#xff1b;并將從服務器上得到的結果返回給Internet上請求連接的客戶端&#x…

Vue 2.0 與 Vue 3.0 的主要差異

Vue 2.0 與 Vue 3.0 的主要差異 在前端框架的世界中&#xff0c;Vue.js 已經成為了一股不可忽視的力量。自從 Vue.js 首次亮相以來&#xff0c;它便以其輕量級、靈活性和易用性贏得了開發者的喜愛。然而&#xff0c;隨著技術的不斷進步和開發者需求的不斷變化&#xff0c;Vue.…

Android AppCompatActivity 方法詳解

在 Android 開發中&#xff0c;AppCompatActivity 是一個常用的類&#xff0c;它提供了對新版 Android 特性在舊版 Android 上的兼容支持。作為 Android 支持庫的一部分&#xff0c;它通常被用作活動&#xff08;Activity&#xff09;的基類。下面我們將介紹 AppCompatActivity…

Vins-Moon配準運行

Vins-Moon運行 源碼地址電腦配置環境配置編譯適配Kitti數據集運行結果Euroc數據集kitti數據集 evo評估&#xff08;KITTI數據&#xff09;輸出軌跡(tum格式)結果 源碼地址 源碼鏈接&#xff1a;https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git 電腦配置 Ubuntu 18.…

破解SQL Server迷局,徹底解決“管道的另一端無任何進程錯誤233”

問題描述&#xff1a;在使用 SQL Server 2014的時候&#xff0c;想用 SQL Server 身份方式登錄 SQL Servcer Manager&#xff0c;結果報錯&#xff1a; 此錯誤消息&#xff1a;表示SQL Server未偵聽共享內存或命名管道協議。 問題原因&#xff1a;此問題的原因有多種可能 管道…

人才測評系統在企業中的作用有哪些?

一個企業除了產出價值給社會&#xff0c;它還有自己的工作架構體系&#xff0c;無論的工作時間制度上&#xff0c;還是工資組成方向&#xff0c;這樣公司才能正常運轉&#xff0c;那么人才測評系統可以在企業中充當一個什么角色呢&#xff1f;又或者說它起著什么作用呢&#xf…

【數據結構】棧和隊列(概念選擇題)

1.概念選擇題 1.一個棧的初始狀態為空。現將元素1、2、3、4、5、A、B、C、D、E依次入棧&#xff0c;然后再依次出棧&#xff0c;則元素出 棧的順序是&#xff08; &#xff09;。 A 12345ABCDE B EDCBA54321 C ABCDE12345 D 54321EDCBA2.若進棧序列為 1,2,3,4 &#xff0c;進棧…