日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原来以为(Trie)字典树很难,后来发现不久这么一回事嘛

發(fā)布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原来以为(Trie)字典树很难,后来发现不久这么一回事嘛 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

字典樹 牛逼

什么是字典樹

字典樹,是一種空間換時間的數(shù)據(jù)結構,又稱Trie樹、前綴樹,是一種樹形結構(字典樹是一種數(shù)據(jù)結構),典型用于統(tǒng)計、排序、和保存大量字符串。所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計。它的優(yōu)點是:利用字符串的公共前綴來減少查詢時間,最大限度地減少無謂的字符串比較,查詢效率比哈希樹高。

可能大部分情況你很難直觀或者有接觸的體驗,可能對前綴這個玩意沒啥概念,可能做題遇到前綴問題也是暴力匹配蒙混過關,如果字符串比較少使用哈希表等結構可能也能蒙混過關,但如果字符串比較長、相同前綴較多那么使用字典樹可以大大減少內存的使用和效率。一個字典樹的應用場景:在搜索框輸入部分單詞下面會有一些神關聯(lián)的搜索內容,你有時候都很神奇是怎么做到的,這其實就是字典樹的一個思想。

對于字典樹,有三個重要性質:

1:根節(jié)點不包含字符,除了根節(jié)點每個節(jié)點都只包含一個字符。root節(jié)點不含字符這樣做的目的是為了能夠包括所有字符串。

2:從根節(jié)點到某一個節(jié)點,路過字符串起來就是該節(jié)點對應的字符串。

3:每個節(jié)點的子節(jié)點字符不同,也就是找到對應單詞、字符是唯一的。

設計實現(xiàn)字典樹

上面已經(jīng)介紹了什么是字典樹,那么我們開始設計一個字典樹吧!

對于字典樹,可能不同的場景或者需求設計上有一些細致的區(qū)別,但整體來說一般的字典樹有插入、查詢(指定字符串)、查詢(前綴)。

我們首先來分析一下簡單情況吧,就是字符串中全部是26個小寫字母,剛好力扣208實現(xiàn)Trie樹可以作為一個實現(xiàn)的模板。

實現(xiàn) Trie 類:

  • Trie() 初始化前綴樹對象。
  • void insert(String word) 向前綴樹中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前綴樹中,返回 true(即,在檢索之前已經(jīng)插入);否則,返回 false 。
  • boolean startsWith(String prefix) 如果之前已經(jīng)插入的字符串 word 的前綴之一為 prefix ,返回 true ;否則,返回 false 。

怎么設計這個字典樹呢?

對于一個字典樹Trie類,肯定是要有一個根節(jié)點root的,而這個節(jié)點類型TrieNode也有很多設計方式,在這里我們?yōu)榱撕唵畏乓粋€26個大小的TrieNode類型數(shù)組,分別對應’a’-'z’的字符,同時用一個boolean類型變量isEnd表示是否為字符串末尾結束(如果為true說明)。

class TrieNode {TrieNode son[];boolean isEnd;//結束標志public TrieNode()//初始化{son=new TrieNode[26];} }

用數(shù)組的話如果字符比較多的話可能會消耗一些內存空間,但是這里26個連續(xù)字符還好的,如果向一個字典樹中添加big,bit,bz 那么它其實是這樣的:

那么再分析一下具體操作:

插入操作:遍歷字符串,同時從字典樹root節(jié)點開始遍歷,找到每個字符對應的位置首先判斷是否為空,如果為空需要創(chuàng)建一個新的Trie。比如插入big的枚舉第一個b時候創(chuàng)建TrieNode,后面也是同理。不過重要的是要在停止的那個TrieNode將isEnd設為true表明這個節(jié)點是構成字符串的末尾節(jié)點。

這部分對應的關鍵代碼為:

TrieNode root; /** 初始化 */ public Trie() {root=new TrieNode(); }/** Inserts a word into the trie. */ public void insert(String word) {TrieNode node=root;//臨時節(jié)點用來枚舉for(int i=0;i<word.length();i++)//枚舉字符串{int index=word.charAt(i)-'a';//找到26個對應位置if(node.son[index]==null)//如果為空需要創(chuàng)建{node.son[index]=new TrieNode();}node=node.son[index];}node.isEnd=true;//最后一個節(jié)點 }

查詢操作: 查詢是建立在字典樹已經(jīng)建好的情況下,這個過程和查詢有些類似但不需要創(chuàng)建TrieNode,如果枚舉的過程一旦發(fā)現(xiàn)該TrieNode未被初始化(即為空)則返回false,如果順利到最后看看該節(jié)點的isEnd是否為true(是否已插入已改字符結尾的字符串),如果為true則返回true。

這里用一個例子可能更好懂。插入big串,如果查找ba會因為第二次a對應TrieNode為null為為空。如果查找bi也會返回失敗,因為之前插入的big只在g字符對應TrieNode標識isEnd=true,但i字符下面的isEnd為false,即不存在bi字符串。

該部分對應的核心代碼為:

public boolean search(String word) {TrieNode node=root;for(int i=0;i<word.length();i++){int index=word.charAt(i)-'a';if(node.son[index]==null)//為null直接返回false{return false;}node=node.son[index];}return node.isEnd==true; }

前綴查找:和查詢很相似但是有點區(qū)別,查找失敗的話返回false,但是如果能進行到最后一步那么返回true。上面例子插入big查找bi同樣返回true,因為存在以它為前綴的字符串。

該對應對應的核心代碼為:

public boolean startsWith(String prefix) {TrieNode node=root;for(int i=0;i<prefix.length();i++){int index=prefix.charAt(i)-'a';if(node.son[index]==null){return false;}node=node.son[index];}//能執(zhí)行到最后即返回truereturn true; }

上面代碼合在一起就是完整的字典樹了,最基礎的版本。完整版為:

字典樹小思考

字典樹基礎班很容易,但很可能會出現(xiàn)一些延伸。

對于上面是26個字符的,我們很容易用ASCII找到對應索引,如果字符可能性比較多,用數(shù)組可能浪費的空間比較大,那我們也可以用HashMap或者List來存儲元素啊,用List的話就需要順序枚舉,用HashMap就可以直接查詢,這里就講解一個使用HashMap()實現(xiàn)的字典樹。

使用HashMap替代數(shù)組(不過使用哈希就不自帶排序功能了),其實邏輯是一樣的,只需要判斷時候用HashMap判斷是否存在對應的key即可,HashMap的類型為:

Map<Character,TrieNode> sonMap;

使用HashMap實現(xiàn)的字典樹完整代碼為:

import java.util.HashMap; import java.util.Map;public class Trie{class TrieNode{Map<Character,TrieNode> sonMap;boolean idEnd;public TrieNode(){sonMap=new HashMap<>();}}TrieNode root;public Trie(){root=new TrieNode();}public void insert(String word) {TrieNode node=root;for(int i=0;i<word.length();i++){char ch=word.charAt(i);if(!node.sonMap.containsKey(ch))//不存在插入{node.sonMap.put(ch,new TrieNode());}node=node.sonMap.get(ch);}node.idEnd=true;}public boolean search(String word) {TrieNode node=root;for(int i=0;i<word.length();i++){char ch=word.charAt(i);if(!node.sonMap.containsKey(ch)){return false;}node=node.sonMap.get(ch);}return node.idEnd==true;//必須標記為true證明有該字符串}public boolean startsWith(String prefix) {TrieNode node=root;for(int i=0;i<prefix.length();i++){char ch=prefix.charAt(i);if(!node.sonMap.containsKey(ch)){return false;}node=node.sonMap.get(ch);}return true;//執(zhí)行到最后一步即可} }

前面講了,字典樹用于大量字符的統(tǒng)計、排序、儲存,其實排序就是和采用數(shù)組的方式可以進行排序,因為字符的ASCII有序,在讀取時候可以按照這個規(guī)則讀取,這個思想就和基數(shù)排序有點像了。

而統(tǒng)計的話可能會面臨數(shù)量上統(tǒng)計,可能是出現(xiàn)過次數(shù)或者前綴單詞數(shù)量統(tǒng)計,如果每次都枚舉可能有點浪費時間,但你可以TrieNode中添加一個變量,每次插入的時候可以統(tǒng)計次數(shù)。如果字符串有重復那可以直接添加,如果字符串要去重那可以確定插入成功再給路徑上前綴單詞總數(shù)分別自增。這個的話就要具體問題具體分析了。

此外,字典樹還有一個在ACM中用于解決求異或最值的問題,我們稱之為:01字典樹,大家感興趣也可以自行了解(后面可能會介紹)。

總結

通過本文,想必你對字典樹有了一個較好的認識,本篇的話目的還是在于讓讀者能夠認識和學會基礎的字典樹,對其它變形優(yōu)化能有個初步的認識。

字典樹可以最大限度地減少無謂的字符串比較,用于詞頻統(tǒng)計和大量字符串排序。自帶排序功能,使用中序遍歷序列即可得到排序序列。但是如果字符很多相同前綴很少的話那字典樹就沒啥效率優(yōu)勢的(因為要一個一個訪問節(jié)點)。

字典樹的真實應用有很多,例如字符串檢索、文本預測、自動完成,see also,拼寫檢查、詞頻統(tǒng)計、排序、字符串最長公共前綴、字符串搜索的前綴匹配、作為其他數(shù)據(jù)結構和算法的輔助結構等等,這里就不再介紹啦。

原創(chuàng)不易,還請點贊、關注、收藏三連支持,微信搜一搜【bigsai】,關注我,第一時間獲取干貨內容!

總結

以上是生活随笔為你收集整理的原来以为(Trie)字典树很难,后来发现不久这么一回事嘛的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人深夜影院 | 老公吃小头头视频免费观看 | 久久艹精品 | 手机看片国产日韩 | 欧美日韩成人 | 久久性| 亚洲av日韩av在线观看 | 小宝贝真紧h军人h | 在线观看污网站 | av电影网站在线观看 | 久久久夜夜 | 粗大黑人巨茎大战欧美成人 | jizjiz中国少妇高潮水多 | a少妇| 久久精品一区二区国产 | 不卡中文字幕 | 亚色在线 | 欧美涩涩涩 | 91高跟黑色丝袜呻吟在线观看 | 手机在线亚洲 | 日韩123区| 91麻豆精品一二三区在线 | 波多野结衣黄色网址 | 无码人妻一区二区三区精品视频 | 污污小说在线观看 | 国产成人免费在线视频 | 久久久久久麻豆 | 亚洲男人影院 | 男人的天堂视频网站 | 国产理论视频在线观看 | 97精品国产露脸对白 | 538在线精品 | 尤物网站在线观看 | 岛国精品一区二区 | 天天操综合网 | 二级毛片在线观看 | 26uuu精品一区二区 | 国产一区二区视频在线观看 | 97精品人妻麻豆一区二区 | 欧美日韩性生活视频 | 韩国一级淫片免费看 | 香蕉视频在线网站 | 亚洲成人播放器 | 午夜激情免费 | 国产专区一区二区 | 午夜综合网| 朴银狐电影中文在线看 | 杂技xxx裸体xxxx欧美 | 国产一区二区三区在线播放无 | 亚洲精品中文字幕在线 | 欧美午夜精品久久久久久蜜 | 国产精品乱码久久久久久 | 老师上课夹震蛋高潮了 | 日日好av| 国产第二页 | 成人欧美一区 | 日本黄色大片在线观看 | 69er小视频| 亚洲嫩草影院 | 人妻精品无码一区二区三区 | 欧美成人久久久免费播放 | 森泽佳奈作品在线观看 | 色花av | 亚洲乱强伦 | 99亚洲视频 | 午夜67194 | 在线中文av| 亚洲福利视频网站 | 调教少妇视频 | 国内精品视频在线观看 | 亚洲一区高清 | 黄色免费网 | 日韩三级麻豆 | 在线不卡 | 国产av自拍一区 | 13日本xxxxxⅹxxx20 | 欧美视频在线观看一区 | 72种无遮挡啪啪的姿势 | 中国在线观看片免费 | 日韩精品卡通动漫网站 | 中文字幕av有码 | 91成人精品视频 | 国产一区二区精华 | 亚洲黄色av网站 | 永久免费在线观看视频 | 强制憋尿play黄文尿奴 | 欧美三级视频 | 91国偷自产一区二区三区观看 | 国产69精品久久久久久 | 欧美日韩精品一区二区三区四区 | 亚洲一级av无码毛片精品 | 久久艹在线 | 久久蜜臀| 六月综合网 | 国产chinesehd精品 | 国产精品电影在线观看 | 国产一区成人 | 高h乱l高辣h文短篇h | 日本黄色a级片 |