精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字典樹,不就有點不一樣的一顆樹

存儲 存儲軟件
典樹,是一種空間換時間的數據結構,又稱Trie樹、前綴樹,是一種樹形結構(字典樹是一種數據結構),典型用于統計、排序、和保存大量字符串。

[[399147]]

本文轉載自微信公眾號「bigsai」,作者bigsai。轉載本文請聯系bigsai公眾號。

什么是字典樹

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

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

圖片真假可自行驗證

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

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

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

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

一個字典樹

設計實現字典樹

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

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

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

實現 Trie 類:

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

怎么設計這個字典樹呢?

對于一個字典樹Trie類,肯定是要有一個根節點root的,而這個節點類型TrieNode也有很多設計方式,在這里我們為了簡單放一個26個大小的TrieNode類型數組,分別對應'a'-'z'的字符,同時用一個boolean類型變量isEnd表示是否為字符串末尾結束(如果為true說明)。

  1. class TrieNode { 
  2.     TrieNode son[]; 
  3.     boolean isEnd;//結束標志 
  4.     public TrieNode()//初始化 
  5.     { 
  6.         son=new TrieNode[26]; 
  7.     } 

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

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

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

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

  1. TrieNode root; 
  2. /** 初始化 */ 
  3. public Trie() { 
  4.     root=new TrieNode(); 
  5.  
  6. /** Inserts a word into the trie. */ 
  7. public void insert(String word) { 
  8.     TrieNode node=root;//臨時節點用來枚舉 
  9.     for(int i=0;i<word.length();i++)//枚舉字符串 
  10.     { 
  11.         int index=word.charAt(i)-'a';//找到26個對應位置 
  12.         if(node.son[index]==null)//如果為空需要創建 
  13.         { 
  14.             node.son[index]=new TrieNode(); 
  15.         } 
  16.         node=node.son[index]; 
  17.     } 
  18.     node.isEnd=true;//最后一個節點 

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

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

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

  1. public boolean search(String word) { 
  2.     TrieNode node=root; 
  3.     for(int i=0;i<word.length();i++) 
  4.     { 
  5.         int index=word.charAt(i)-'a'
  6.         if(node.son[index]==null)//為null直接返回false 
  7.         { 
  8.             return false
  9.         } 
  10.         node=node.son[index]; 
  11.     } 
  12.     return node.isEnd==true

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

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

  1. public boolean startsWith(String prefix) { 
  2.     TrieNode node=root; 
  3.     for(int i=0;i<prefix.length();i++) 
  4.     { 
  5.         int index=prefix.charAt(i)-'a'
  6.         if(node.son[index]==null
  7.         { 
  8.             return false
  9.         } 
  10.         node=node.son[index]; 
  11.     } 
  12.   //能執行到最后即返回true 
  13.     return  true

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

代碼

字典樹小思考

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

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

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

Map

使用HashMap實現的字典樹完整代碼為:

  1. import java.util.HashMap; 
  2. import java.util.Map; 
  3.  
  4. public  class Trie{ 
  5.     class TrieNode{ 
  6.         Map<Character,TrieNode> sonMap; 
  7.         boolean idEnd; 
  8.         public TrieNode() 
  9.         { 
  10.             sonMap=new HashMap<>(); 
  11.         } 
  12.     } 
  13.     TrieNode root; 
  14.     public Trie() 
  15.     { 
  16.         root=new TrieNode(); 
  17.     } 
  18.  
  19.     public void insert(String word) { 
  20.         TrieNode node=root; 
  21.         for(int i=0;i<word.length();i++) 
  22.         { 
  23.             char ch=word.charAt(i); 
  24.             if(!node.sonMap.containsKey(ch))//不存在插入 
  25.             { 
  26.                 node.sonMap.put(ch,new TrieNode()); 
  27.             } 
  28.             node=node.sonMap.get(ch); 
  29.         } 
  30.         node.idEnd=true
  31.     } 
  32.  
  33.     public boolean search(String word) { 
  34.         TrieNode node=root; 
  35.         for(int i=0;i<word.length();i++) 
  36.         { 
  37.             char ch=word.charAt(i); 
  38.             if(!node.sonMap.containsKey(ch)) 
  39.             { 
  40.                 return false
  41.             } 
  42.             node=node.sonMap.get(ch); 
  43.         } 
  44.         return node.idEnd==true;//必須標記為true證明有該字符串 
  45.     } 
  46.  
  47.  
  48.     public boolean startsWith(String prefix) { 
  49.         TrieNode node=root; 
  50.         for(int i=0;i<prefix.length();i++) 
  51.         { 
  52.             char ch=prefix.charAt(i); 
  53.             if(!node.sonMap.containsKey(ch)) 
  54.             { 
  55.                 return false
  56.             } 
  57.             node=node.sonMap.get(ch); 
  58.         } 
  59.         return true;//執行到最后一步即可 
  60.     } 

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

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

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

總結

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

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

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

 

責任編輯:武曉燕 來源: bigsai
相關推薦

2012-12-20 10:17:32

IT運維

2012-03-07 17:24:10

戴爾咨詢

2023-11-21 09:01:30

2013-08-14 15:07:46

Windows 8.1Windows 8.1

2016-05-09 18:40:26

VIP客戶緝拿

2015-10-19 12:33:01

華三/新IT

2017-05-25 15:02:46

聯宇益通SD-WAN

2017-11-20 09:08:13

HPC機器學習DNN

2009-12-01 16:42:27

Gentoo Linu

2009-02-04 15:43:45

敏捷開發PHPFleaPHP

2018-05-09 15:42:24

新零售

2009-06-12 15:26:02

2011-02-28 10:38:13

Windows 8

2016-03-24 18:51:40

2013-01-11 18:10:56

軟件

2015-08-25 09:52:36

云計算云計算產業云計算政策

2009-07-07 10:44:14

多態

2015-08-04 14:49:54

Discover

2011-03-14 16:51:24

2019-01-03 14:39:08

Oracle甲骨文ORACLE
點贊
收藏

51CTO技術棧公眾號

久久精品色欧美aⅴ一区二区| 欧美日韩亚洲高清| 亚洲a一级视频| 国产午夜激情视频| 精品欧美激情在线观看| 6080国产精品一区二区| 亚洲一区二区三区av无码| 国产在线视频你懂得| 国产一区在线观看麻豆| 国内揄拍国内精品少妇国语| 亚洲性猛交xxxx乱大交| 精品成人18| 91久久一区二区| 9色porny| 免费av在线网址| 久久影院午夜论| 91aaaa| 亚洲午夜无码久久久久| 亚洲国产精品一区制服丝袜| 这里只有视频精品| 精品国产人妻一区二区三区| 日本国产一区| 色婷婷久久久久swag精品| 日韩精品免费一区| 婷婷五月在线视频| 久久久久久久久久美女| 国产 高清 精品 在线 a| 国产又爽又黄的视频| 欧美va天堂| 色av中文字幕一区| 一级性生活大片| 成人av地址| 欧美一区二区精品在线| 色片在线免费观看| 成人爽a毛片免费啪啪| 亚洲国产精品综合小说图片区| 亚洲精品欧洲精品| 国模吧精品人体gogo| 99re亚洲国产精品| 国产精品免费一区二区三区四区| 国产免费黄色录像| 久久99精品久久久| 国产精品久久久久不卡| 黑人精品无码一区二区三区AV| 亚洲激情在线| 韩国视频理论视频久久| 麻豆视频在线观看| 一区二区三区在线| 欧美成年人视频| 538精品在线视频| 91精品精品| 久久成人人人人精品欧| 日本一级片免费| 99精品视频在线| 日韩中文在线观看| 国产黄色小视频网站| 色小子综合网| 久久亚洲精品成人| 久久免费看少妇高潮v片特黄| 91精品国产成人观看| 久久人人爽人人爽爽久久| 国产福利视频网站| 欧美激情第10页| 久久久久久综合网天天| 国产主播在线观看| 亚洲激情婷婷| 国产精品高清免费在线观看| 中文在线字幕免费观| 麻豆一区二区三| 亚洲一区二区三区四区视频| 精品人妻一区二区三区日产乱码 | 久久久免费电影| 日本五十路女优| 亚洲一区二区三区高清不卡| 欧美一级高清免费播放| 波多野结衣视频在线观看| 免费在线观看一区二区三区| 国产999精品视频| 91麻豆成人精品国产| 国产福利一区二区三区视频| 国产自产精品| 爱久久·www| 亚洲精品一二三区| 成熟丰满熟妇高潮xxxxx视频| 成人性生活av| 91精品在线免费观看| 人妖粗暴刺激videos呻吟| 九九视频精品全部免费播放| www日韩欧美| 久久精品国产亚洲AV无码男同| 亚洲综合国产| 国产一区二区在线免费| 懂色av蜜臀av粉嫩av分享吧| 久久久777精品电影网影网| 中文字幕一区二区三区精彩视频 | 免费国产黄色片| 久久久久免费观看| 99视频精品全部免费看| 欧美成人黑人| 日韩一区二区三区观看| av在线网站观看| 综合久久99| 日本sm极度另类视频| 国产免费av观看| 国产婷婷一区二区| 18禁裸男晨勃露j毛免费观看| 怡红院成人在线| 精品国产污污免费网站入口 | 亚洲激情校园春色| 国产免费人做人爱午夜视频| 免费一级欧美在线大片| 国产亚洲精品激情久久| 久久久久免费看| 久久精品国产亚洲一区二区三区| 精品视频在线观看| 精精国产xxxx视频在线| 色综合久久久久| 精品人妻在线视频| 天天射天天综合网| 国产精品国内视频| 四虎电影院在线观看| 亚洲视频一区在线| 美女一区二区三区视频| 日韩有码av| 久久久视频免费观看| 999久久久久| 国产精品久久久久四虎| 欧美日韩亚洲一二三| 青青久久av| 久久欧美在线电影| www.av黄色| 亚洲欧美日韩在线播放| av中文字幕网址| 欧美1级片网站| 国产精品视频不卡| 国产精品二线| 在线观看日韩电影| 91成年人网站| 午夜一级在线看亚洲| 九色一区二区| 一区二区三区电影大全| 日韩电视剧免费观看网站| 精品亚洲永久免费| 风流少妇一区二区| 996这里只有精品| 婷婷综合国产| 欧美激情二区三区| 韩国av在线免费观看| 亚洲一区在线电影| 成人在线观看一区二区| 国产精品久久| 国产美女99p| 嗯啊主人调教在线播放视频| 亚洲激情久久久| 天天综合天天干| 国产亚洲综合色| 一区二区xxx| 91久久夜色精品国产按摩| 91欧美精品午夜性色福利在线| 欧美边添边摸边做边爱免费| 3d动漫精品啪啪1区2区免费| 精品人妻伦九区久久aaa片| 国产精品原创巨作av| 男人添女人下部视频免费| 成功精品影院| 日韩美女福利视频| 中文字幕在线免费| 欧美一区二区福利在线| 久久久久久天堂| 久久亚洲捆绑美女| 亚洲欧美国产日韩综合| 亚洲色图插插| 国产一区二区高清视频| 国产欧美一区二区三区精品酒店| 国产亚洲美女精品久久久| 一级片视频免费| 亚洲一区二区三区精品在线| 中文字字幕码一二三区| 九色|91porny| 日韩中字在线观看| 欧美色资源站| 成人免费黄色网| 成人观看网址| 最新69国产成人精品视频免费| www.久久色| 色天使久久综合网天天| 日韩va亚洲va欧美va清高| 成人av免费观看| 人人干人人干人人| 在线观看不卡| 亚洲激情一区二区| 久草在线综合| 成人黄色免费网站在线观看| 国产精品一区二区日韩| 日韩在线观看免费高清| 午夜影院在线视频| 在线播放一区二区三区| 一级片中文字幕| 亚洲私人黄色宅男| 成人免费网站黄| 国产91富婆露脸刺激对白| 男人女人黄一级| 亚洲大胆av| 最新av在线免费观看| 亚洲黄色录像| 国产99在线免费| 日本国产一区| 国产精品久久久久久超碰| 成人性生交大片免费看网站| 日韩在线视频二区| 青青视频在线观| 精品国产乱码久久久久久蜜臀| 亚洲熟女乱色一区二区三区久久久| 亚洲成人自拍网| 欧美黄色aaa| 国产精品成人在线观看| 尤物视频最新网址| 成人美女视频在线看| 亚洲av毛片在线观看| 日韩成人一区二区| av免费中文字幕| 妖精视频成人观看www| 今天免费高清在线观看国语| 国产精品免费不| 麻豆亚洲一区| 欧美日韩一区二区三区在线电影| 亚洲一区二区三区视频| 只有精品亚洲| 国产免费成人av| 免费视频观看成人| 国产精品爱啪在线线免费观看| 欧美13videosex性极品| 91高清视频在线免费观看| 在线看三级电影| 欧美老女人性视频| 污污网站在线看| 欧美丰满片xxx777| caopo在线| 欧美成人精品不卡视频在线观看| 视频免费一区| 久久精品国产成人| 日本在线www| 久热国产精品视频| 国产美女福利在线| 欧美成人免费一级人片100| 黄色在线观看网站| 九色精品免费永久在线| 亚洲七七久久综合桃花剧情介绍| 欧美成人国产va精品日本一级| 成人福利片网站| 免费91在线视频| 黄色羞羞视频在线观看| 久久久综合av| 水蜜桃在线视频| 国产精品毛片a∨一区二区三区|国| 国产精品亚洲一区二区三区在线观看| 日韩美女视频在线观看| 欧美福利在线播放| 国产日韩在线亚洲字幕中文| 四虎成人精品一区二区免费网站| 91香蕉亚洲精品| 国产精品久av福利在线观看| 精品无人乱码一区二区三区的优势| 美女一区2区| 日韩欧美亚洲区| 亚州av乱码久久精品蜜桃| 国产一二三四区在线观看| 欧美日韩网址| 欧美s码亚洲码精品m码| 日韩精品久久理论片| 奇米影视四色在线| 国产成人在线网站| 久久精品女同亚洲女同13| 久久综合成人精品亚洲另类欧美 | 日本一欧美一欧美一亚洲视频| 成人线上视频| 91在线观看免费高清| 久久影视三级福利片| 日本一区二区三区www| 911久久香蕉国产线看观看| 蜜臀精品一区二区| 久久一二三四| 女人扒开腿免费视频app| 99国产精品久久久久久久久久 | 亚洲免费三区一区二区| 精品成人久久久| 精品视频在线看| 欧美熟妇交换久久久久久分类 | 免费成人美女女在线观看| 亚洲欧美电影一区二区| 国产午夜精品无码| 欧美日韩小视频| 香蕉国产在线视频| 久久在线免费视频| 国产自产自拍视频在线观看| 国产成人精品久久久| 免费精品一区二区三区在线观看| 老牛影视免费一区二区| 亚洲精品一区二区在线看| 免费毛片小视频| 国产在线一区观看| 加勒比一区二区| 夜夜爽夜夜爽精品视频| 在线观看国产区| 亚洲精品一区二区三区影院 | 一色屋精品亚洲香蕉网站| 日韩高清精品免费观看| 7878成人国产在线观看| 色就是色亚洲色图| 欧美国产日产韩国视频| 国产黄色一区| 欧美日韩精品久久| 伊人久久成人| 亚洲一区二区三区四区精品| 国产片一区二区| 九九热在线视频播放| 精品少妇一区二区三区日产乱码| 午夜视频在线| 国产精品444| 香蕉久久99| 熟女少妇在线视频播放| 国产电影精品久久禁18| 乱老熟女一区二区三区| 在线观看一区日韩| 天堂在线资源库| 性日韩欧美在线视频| 激情久久免费视频| 超碰免费在线公开| 日韩av不卡一区二区| 亚洲做受高潮无遮挡| 午夜一区二区三区在线观看| av综合在线观看| 久久亚洲影音av资源网| 欧美爱爱视频| 亚洲最新在线| 久久国产精品免费| 亚洲黄色网址大全| 欧美三级在线视频| 午夜视频成人| 91久久国产婷婷一区二区| 91亚洲成人| 制服丝袜中文字幕第一页| 中文字幕不卡一区| 伊人免费在线观看| 神马久久久久久| 国产乱码精品一区二区三区亚洲人| 亚洲午夜精品一区二区| 蜜桃久久av一区| 一级黄色毛毛片| 欧美日韩1区2区| 国内外激情在线| 91国产在线免费观看| 欧美在线亚洲综合一区| 女同性αv亚洲女同志| 亚洲国产成人高清精品| 五月激情六月婷婷| 欧美在线视频网站| 国产中文字幕一区二区三区| 成人免费视频久久| 国产精品久久免费看| 国产永久免费视频| 久久91亚洲精品中文字幕奶水| 亚洲一区二区电影| 亚洲中文字幕无码av永久| 久久综合九色综合欧美98| 欧美性受xxx黑人xyx性爽| 日韩在线观看免费高清| 2023国产精华国产精品| jizzjizz国产精品喷水| 久久精品日产第一区二区三区高清版| 中文字字幕在线观看| 欧美成人精品影院| 国产图片一区| 日本中文字幕片| 国产精品无码永久免费888| av免费在线观看不卡| 97在线看福利| 日韩精品久久| 久久av一区二区三| 色婷婷av一区二区三区gif| av大片在线观看| 成人欧美一区二区三区视频| 欧美一级久久| 五月天婷婷色综合| 日韩精品免费电影| 日韩精品免费观看视频| 无码毛片aaa在线| 久久老女人爱爱| www.激情五月.com| 欧美做受高潮电影o| 亚洲天堂免费| 色婷婷在线影院| 日韩你懂的在线观看| 国精产品一区二区三区有限公司| 亚洲精品国产suv一区88| 国产日韩视频一区二区三区| 亚洲精品网站在线| 国产一区欧美二区三区| 99国产精品久久久久久久 | 你懂的在线看|