數(shù)據(jù)結(jié)構(gòu)-Trie樹

Trie 樹的定義:

? ? Trie 樹毁欣,即字典樹,又稱前綴樹岳掐,是一種多叉樹結(jié)構(gòu)凭疮。典型的應(yīng)用是用于統(tǒng)計和排序大量的字符串,它的優(yōu)點(diǎn)是:最大限度地減少無謂的字符串比較串述,查詢效率比哈希表高执解。

Trie 的定義

Trie 樹的基本性質(zhì):

1、根節(jié)點(diǎn)不包含字符纲酗,除根節(jié)點(diǎn)外每一個節(jié)點(diǎn)都只包含一個字符材鹦。

2、從根節(jié)點(diǎn)到某一個節(jié)點(diǎn)耕姊,路徑上經(jīng)過的字符連接起來桶唐,為該節(jié)點(diǎn)對應(yīng)的字符串。

3茉兰、每個節(jié)點(diǎn)的所有子節(jié)點(diǎn)包含的字符都不相同尤泽。

Trie 樹的結(jié)構(gòu):

Node節(jié)點(diǎn):表示Trie 樹的每個節(jié)點(diǎn),里面 isWord 表示該節(jié)點(diǎn)是否是一個單詞的末尾;next 是下一個元素的映射坯约。外層是根節(jié)點(diǎn) root 信息熊咽,以及Trie 樹中存儲的單詞數(shù)量。

Trie 樹成員變量

Trie 樹中添加一個新的單詞:

????思路:先把 root 節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn) cur闹丐,遍歷新增單詞的每個字符横殴,判斷 cur.next 的Map 映射中是否包含當(dāng)前字符,如果不包含卿拴,則新增一個映射關(guān)系衫仑,然后將 cur = cur.next.get(c),進(jìn)行下一個循環(huán)堕花。循環(huán)結(jié)束文狱,說明走到了單詞末尾,此時需要根據(jù)cur.isWord 判斷是否已經(jīng)存在這個單詞缘挽,如果為 cur.isWord == True瞄崇,說明已經(jīng)存在,則不執(zhí)行添加操作壕曼,否則執(zhí)行添加操作苏研。?

add(String word)

在Trie 中是否包含某個單詞:

????思路:思路跟 add 類似,只是在判斷cur.next.containsKey(c)中腮郊,為false時楣富,直接返回 fasle,循環(huán)結(jié)束之后伴榔,要看單詞末尾元素的isWord 是否為True纹蝴,只有為True,才能說明包含這個單詞踪少,否則可能只是一個單詞的前綴塘安。?

contains

在 Trie 中查詢是否存在某個單詞是有prefix 為前綴的:

????思路:思路跟 contains類似,只是循環(huán)結(jié)束后援奢,無論最后一個元素是否是單詞的末尾兼犯,都被認(rèn)為是前綴。

isPrefix

在 Trie 中查找某個單詞是否存在集漾,其中 '. ' 代表任意一個字符:

????思路:由于前面的操作都是規(guī)范的字符串切黔,所以能夠通過cur = cur.next.get(c) 來遍歷所有元素,但是本方法有特殊字符 '.'具篇,無法通過該字符纬霞,找到下一個結(jié)點(diǎn),所以驱显,必須采用遞歸的思想诗芜。match(Node node, String word, int index)瞳抓,以node為根節(jié)點(diǎn)的Trie 中查找單詞word中的下標(biāo)為index的字符。遞歸終止條件為:index == word.length()伏恐,字符串走完了孩哑,判斷最后一個結(jié)點(diǎn)node是否是單詞末尾;然后對 字符c 與 '.' 進(jìn)行單獨(dú)判斷翠桦,如果c 横蜒!= '.',則node = node.next.get(c)销凑,繼續(xù)遞歸執(zhí)行丛晌;如果 c == '.',則需要遍歷當(dāng)前node下所有的節(jié)點(diǎn)闻鉴,然后每個節(jié)點(diǎn)遞歸執(zhí)行,只要有一個節(jié)點(diǎn)的遞歸結(jié)果為true茂洒,就認(rèn)為已經(jīng)匹配上了孟岛。

search
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市督勺,隨后出現(xiàn)的幾起案子渠羞,更是在濱河造成了極大的恐慌,老刑警劉巖智哀,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次询,死亡現(xiàn)場離奇詭異,居然都是意外死亡瓷叫,警方通過查閱死者的電腦和手機(jī)屯吊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摹菠,“玉大人盒卸,你說我怎么就攤上這事〈伟保” “怎么了蔽介?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煮寡。 經(jīng)常有香客問我虹蓄,道長,這世上最難降的妖魔是什么幸撕? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任薇组,我火速辦了婚禮,結(jié)果婚禮上坐儿,老公的妹妹穿的比我還像新娘体箕。我一直安慰自己专钉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布累铅。 她就那樣靜靜地躺著跃须,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娃兽。 梳的紋絲不亂的頭發(fā)上菇民,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機(jī)與錄音投储,去河邊找鬼第练。 笑死,一個胖子當(dāng)著我的面吹牛玛荞,可吹牛的內(nèi)容都是我干的娇掏。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼勋眯,長吁一口氣:“原來是場噩夢啊……” “哼婴梧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起客蹋,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塞蹭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讶坯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體番电,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年辆琅,在試婚紗的時候發(fā)現(xiàn)自己被綠了漱办。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡婉烟,死狀恐怖洼冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隅很,我是刑警寧澤撞牢,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站叔营,受9級特大地震影響屋彪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绒尊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一畜挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婴谱,春花似錦蟹但、人聲如沸躯泰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麦向。三九已至,卻和暖如春客叉,著一層夾襖步出監(jiān)牢的瞬間诵竭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工兼搏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卵慰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓佛呻,卻偏偏與公主長得像裳朋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吓著,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容