成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

「算法與數據結構」Trie樹之美

開發 算法
這次分享的Trie字典樹,是數據結構專題中的一個分支,認識了解Trie這種樹型數據結構,對構建算法與數據結構知識體系有一定的幫助。

[[349418]]

 前言

這次分享的Trie字典樹,是數據結構專題中的一個分支,認識了解Trie這種樹型數據結構,對構建算法與數據結構知識體系有一定的幫助。

我對Trie樹的理解:把字符串都串接起來,消滅不必要的存儲,利用的就是字符串的公共前綴。

其實對于它的理解,你理解了這句話即可👇

利用字符串的公共前綴來減少查詢時間,最大限度的減少無謂的字符串比較,查詢效率比哈希樹高。

如果你還不了解什么是Trie數據結構的話,或者知道一些,但是對于它具體是如何實現一個簡單Trie樹時,那么這篇文章可能適合你閱讀。

那么圍繞以下幾個點來展開介紹Trie樹👇

  • 基本概念
  • 基本性質
  • 應用場景
  • 2個例題

基本概念

首先,我們對Trie樹得做一些基本的了解。Trie樹中文名叫字典樹,前綴樹等,接下來我就以字典樹稱呼。

我們來看下維基百科對它的描述吧⬇️

在計算機科學中,trie,又稱前綴樹或字典樹,是一種有序樹,用于保存關聯數組,其中的鍵通常是字符串。與二叉查找樹不同,鍵不是直接保存在節點中,而是由節點在樹中的位置決定。一個節點的所有子孫都有相同的前綴,也就是這個節點對應的字符串,而根節點對應空字符串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。

樸實無華的描述,其實我們看一張圖就能看明白了~,我在網上找了一張不錯的圖,具體的出處,這里就不補充了,因為實在找不到原作者~

 

字典樹圖解1

這里需要說明的內容就是,一般而言,應該是用一個點來表示一個字符,這里為了更好的說明,所以我就是用邊來描述字符。

可以發現,這棵字典樹用邊來代表字母,而從根結點到樹上某一結點的路徑就代表了一個字符串。舉個例子, 1→2→6表示的就是字符串 aba 。

再比如,1→4→8構成的字符串是ca,那么如果在往下拓展的話,我們是不是有 caa,cab,那么他們都會經過1→4→8,這些路徑,說明他們是有一段公共的前綴,這個前綴的內容就是ca,說道這里,我們就知道字典樹利用的就是字符串的前綴來解決問題。

那么具體它有哪些性質的話,我們下文介紹一下~

基本性質

對于上述概念有了一定的理解后,我們接下來就看下Trie樹的基本性質。

可以根據這個,大體上分成三個點來說👇

  1. 根節點不包含字符,除根節點外,每個節點只包含一個字符。
  2. 從根節點到某一個節點,路徑上經過的字符連接起來,為該節點對應的字符串。
  3. 每個節點的所有子節點包含的字符串不相同。

接下來我們可以稍微分析一下,可以結合一個圖來看看👇

我們通過拿how,hi,her,hello,so,see這6個字符串構造出來的就是下面圖這個樣子。

 

 


圖解Trie樹

 

第一個性質:

從圖中也可以看出,根節點是/, 代表的內容也就是空,其他的節點比如,根節點下一個層級,有 h和s,分別代表的是兩個字符。

第二個性質:

從根節點到某一個節點,路徑上經過的字符連接起來,為該節點對應的字符串。

比如how表示的就是一個字符串,hi,也表示的是一個字符串,可是你會不會好奇,he和hel為什么不能表示一個字符串呢?

當你想到這里的話,說明你已經看得很仔細,馬上就要掌握它了,確實,從圖中看,我們會發現有些節點顏色不同,這是因為,我們預定好以這個深色的節點代表當前是一個字符串的結尾,想一想,這樣子的作用是啥?

那么實際代碼中,我們應該如何去約定或者做個標記呢,其實只要設置一個標記位即可。

比如下面這樣子👇

  1. const TrieNode = function () { 
  2.   this.next = Object.create(null
  3.   this.isEnd = false 
  4. }; 

當前的isEnd變量就表示當前的節點是不是結束串,當isEnd為True時,表示從根節點開始,到這個字符,所構成的字符串是存在的,是一個完整的字符串。

第三個性質:

每個節點的所有子節點包含的字符串不相同。

很明顯,我們從根節點開始,依次往下走,會發現,每個節點下面的節點是不相同的,所以依次組成的字符串不可能相同。

應用場景

對Trie樹,有一定了解后,我們就可以看看它有哪些的實際應用場景了。

這里參考的是網上所提供的幾個點👇

在搜索引擎中關鍵詞提示,引擎會自動彈出匹配關鍵詞的下拉框,這種應用場景大家應該都很熟悉。

 

 

下拉框

 

 

那么應該如何利用一種高效的數據結構存儲呢,這里就符合字典樹的性質,所以可以利用字典樹來構造特定的數據,達到一種更加快速檢索的效果。

字符串檢索

事先將已知的一些字符串(字典)的有關信息保存到trie樹里,查找另外一些未知字符串是否出現過或者出現頻率,可以舉例子說明情況👇

  • 1000萬字符串,其中有些是重復的,需要把重復的全部去掉,保留沒有重復的字符串。
  • 給出N 個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。

詞頻統計

給定很長的一個串,統計頻數出現次數最多情況,舉個例子👇

  • 有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16字節,內存限制大小是1M。返回頻數最高的100個詞。
  • 一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間復雜度分析。

字符串最長公共前綴

到現在,我們應該知道,Trie樹利用多個字符串的公共前綴來節省存儲空間,當我們把大量字符串存儲到一棵trie樹上時,我們可以快速得到某些字符串的公共前綴,所以可以利用這個特點來解決一些前綴問題。

非要舉個例子的話,有個例子👇

  • 給出N 個小寫英文字母串,以及Q 個詢問,即詢問某兩個串的最長公共前綴的長度是多少?

應用場景還是有很多的,剩下的可以自行去探索,接下來,我們通過實際的題目來看看,如何構造字典樹吧~

2個例子

接下來,我們通過二個題目作為例子,來看看字典樹在實際應用可以解決哪些問題👇

詞典中最長的單詞⭐

鏈接:詞典中最長的單詞

給出一個字符串數組words組成的一本英語詞典。從中找出最長的一個單詞,該單詞是由words詞典中其他單詞逐步添加一個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。

若無答案,則返回空字符串。

示例 1:

  1. 輸入: 
  2. words = ["w","wo","wor","worl""world"
  3. 輸出:"world" 
  4. 解釋:  
  5. 單詞"world"可由"w""wo""wor", 和 "worl"添加一個字母組成。 

示例 2:

  1. 輸入: 
  2. words = ["a""banana""app""appl""ap""apply""apple"
  3. 輸出:"apple" 
  4. 解釋: 
  5. "apply""apple"都能由詞典中的單詞組成。但是"apple"的字典序小于"apply"。 

提示:

這題無非就是找到一個最長的單詞,可以拆分成words數組中某一部分,最暴力的思路就是去枚舉每一項,但是這樣子的時間復雜度是巨大的, 這個時候,我們是不是可以思考一下,這個問題有哪些地方是共性的呢?

  • 沒錯,就是前綴是相同的,從這點來看,是不是就可以利用這個前綴樹,把它數據存儲下來
  • 然后遍歷一遍字典樹,只要這顆樹只有一個分支,則表示它有解,如果存在兩個分支以上的話,則無答案。

復雜度分析

這點應該很好理解,這里就跳過了。

這里的話,我的解法構造字典樹,當然了,也有其他的解法,這里就不展開了,可以看下我的代碼噢~

 

 

最長的串

 

 

代碼點這里☑️

其實你會發現,構造一個Trie樹的話,是很消耗空間的,有點空間換時間的意思,所以具體得根據實際的題目來解決問題。

實現Trie(前綴樹)⭐⭐

鏈接:實現 Trie (前綴樹)

實現一個 Trie (前綴樹),包含 insert, search, 和 startsWith 這三個操作。

示例:

  1. Trie trie = new Trie(); 
  2. trie.insert("apple"); 
  3. trie.search("apple");   // 返回 true 
  4. trie.search("app");     // 返回 false 
  5. trie.startsWith("app"); // 返回 true 
  6. trie.insert("app");    
  7. trie.search("app");     // 返回 true 

說明:

  • 你可以假設所有的輸入都是由小寫字母 a-z 構成的。
  • 保證所有輸入均為非空字符串。

這個題目就是典型的寫Trie樹,對于第一次寫這個題目的話,如果沒有思路的話,可以嘗試先看看別人的代碼,看看基本的套路在哪里。

話不多說,可以參考這份代碼,可以看看如何構造一顆字典樹👇

 

 

leetcode-實現Trie樹

 

 

代碼點這里☑️

剩下的刪除操作,還有統計字符串出現的頻率,可以自己來實現一下,這個基本上不難,畫個圖,就知道如何實現啦~

題目是做不完的,做完這些題目后,希望你能對Trie字典樹有所認識,能對它有更加深入的理解~,接下來準備了四道題集,希望對你們有幫助~

詞典中最長的單詞

實現 Trie (前綴樹)

單詞搜索 II

Loading question

 

責任編輯:姜華 來源: 前端UpUp
相關推薦

2020-11-02 09:15:47

算法與數據結構

2020-10-20 08:14:08

算法與數據結構

2020-10-12 11:48:31

算法與數據結構

2022-09-21 07:57:33

二叉搜索樹排序二叉樹

2022-09-26 07:56:53

AVL算法二叉樹

2021-03-18 08:44:20

Java數據結構算法

2017-10-10 16:59:28

Java數據結構算法解析

2020-10-21 14:57:04

數據結構算法圖形

2020-12-31 05:31:01

數據結構算法

2023-03-08 08:03:09

數據結構算法歸并排序

2023-10-27 07:04:20

2022-01-18 19:13:52

背包問題數據結構算法

2023-03-31 08:24:29

數據結構算法數目

2021-04-07 09:26:37

Java數據結構算法

2021-12-08 11:31:43

數據結構算法合并區間

2021-12-10 11:27:59

數據結構算法單調遞增的數字

2021-12-21 11:39:01

數據結構算法同構字符串

2009-08-11 14:43:42

C#數據結構與算法

2009-08-11 14:51:11

C#數據結構與算法

2021-07-16 04:57:45

Go算法結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本不卡一区二区三区在线观看 | 久久久国产精品视频 | 精品欧美一区二区三区久久久 | 人人澡人人射 | 日韩欧美中文字幕在线观看 | 久久久久久电影 | 精品国产乱码久久久久久丨区2区 | 一级片在线视频 | 午夜免费观看体验区 | 国产精品久久久久一区二区三区 | 99热在线播放 | 大伊人久久 | 久草视频网站 | 国产精品国产三级国产aⅴ中文 | 国产在线不卡 | 人人澡视频 | 草草草草视频 | 欧美性视频在线播放 | 欧美在线a | 天天天天天天操 | 国产一二三区电影 | 日韩日韩日韩日韩日韩日韩日韩 | 激情五月综合网 | 国产高清在线 | 91传媒在线播放 | 久久久久久九九九九 | 亚洲视频在线看 | 亚洲精品乱码久久久久久久久久 | 日韩福利在线观看 | 国产资源在线视频 | 国产91亚洲精品 | 最新中文在线视频 | 国产精品久久国产精品 | 一级片网址 | 伊人网站在线观看 | 午夜欧美| 亚洲福利在线视频 | 日本精品久久 | 中文字幕一区二区三区四区 | 国产欧美在线一区 | 国产一级淫片a直接免费看 免费a网站 |