數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記之字典樹(trie)

  1. 定義

??又稱單詞查找樹,Trie樹帅矗,是一種樹形結(jié)構(gòu)偎肃,是一種哈希樹的變種。典型應(yīng)用是用于統(tǒng)計(jì)浑此,排序和保存大量的字符串(但不僅限于字符串)累颂,所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計(jì)。它的優(yōu)點(diǎn)是:利用字符串的公共前綴來(lái)減少查詢時(shí)間凛俱,最大限度地減少無(wú)謂的字符串比較喘落,查詢效率比哈希樹高。

字典樹

??Trie樹查找每個(gè)條目的復(fù)雜度和字典中條目的個(gè)數(shù)無(wú)關(guān)最冰,而是和查找的條目的長(zhǎng)度有關(guān)瘦棋。常用的場(chǎng)景有通訊錄、最長(zhǎng)公共前綴等等暖哨。
??由上圖可知對(duì)于 Trie的定義可以使用一個(gè)數(shù)據(jù)域和一個(gè)字符數(shù)組完成赌朋,一般情況下數(shù)組的長(zhǎng)度設(shè)置為26即可,但是不同的語(yǔ)言和不同的場(chǎng)景篇裁,可能為導(dǎo)致數(shù)組的程度難以確定沛慢,比如是否考慮大小寫、是否包含其他字符等达布,而且使用數(shù)組的方式可能會(huì)包含多個(gè)空閑位置团甲,導(dǎo)致內(nèi)存資源的浪費(fèi),所以我們使用以下方式定義動(dòng)態(tài)的 Trie黍聂。

class Node{
  //某些條目比如對(duì)于abc躺苦, abcd身腻,在字典樹中如果是通過葉子節(jié)點(diǎn)來(lái)來(lái)判定是否到達(dá)條目的結(jié)尾,那就不存在abc了匹厘。
  //可以給每個(gè)節(jié)點(diǎn)多增加一個(gè)標(biāo)識(shí)嘀趟,用來(lái)標(biāo)識(shí)當(dāng)前節(jié)點(diǎn)是否是一個(gè)條目的結(jié)尾。
  boolean isWord;
  //數(shù)據(jù)  e 和對(duì)應(yīng)的子節(jié)點(diǎn)
  Map<E, Node> next;
}
  1. 基本使用
    ??(1)構(gòu)建字典樹
    //向字典樹中添加一個(gè)元素
    public void add(String word){
        Node cur = root;
        // 遍歷 word愈诚,將每個(gè)字符添加到對(duì)應(yīng)的節(jié)點(diǎn)中
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            // 如果字符對(duì)應(yīng)的節(jié)點(diǎn)不存在她按,則添加節(jié)點(diǎn)
            cur.next.putIfAbsent(c, new Node());
            // 獲取 該節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),重復(fù)操作
            cur = cur.next.get(c);
        }
        // 如果word存在炕柔,則不更新酌泰,如果不存在,則標(biāo)識(shí)當(dāng)前的節(jié)點(diǎn)為字符串的尾部匕累。
        if(!cur.isWord && size ++ >= 0) cur.isWord = true;
    }

??(2)查詢字符

    //從 trie 中查找元素
    public boolean search(String word){
        Node cur = root;
        // 遍歷字符串宫莱,去字典樹中尋找是否有對(duì)應(yīng)的路徑可以表示
        for (int i = 0; i < word.length(); i++) {
            Node node = cur.next.get(word.charAt(i));
            if(node == null) return false;
            cur = node;
        }
        return cur.isWord;
    }
  1. 擴(kuò)展
    ??Tire的刪除操作、壓縮字典樹哩罪、 Tnernay Search Trie授霸、后綴樹。
代碼地址
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末际插,一起剝皮案震驚了整個(gè)濱河市碘耳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌框弛,老刑警劉巖辛辨,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瑟枫,居然都是意外死亡斗搞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門慷妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)僻焚,“玉大人,你說我怎么就攤上這事膝擂÷瞧。” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵架馋,是天一觀的道長(zhǎng)狞山。 經(jīng)常有香客問我,道長(zhǎng)叉寂,這世上最難降的妖魔是什么萍启? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮屏鳍,結(jié)果婚禮上勘纯,老公的妹妹穿的比我還像新娘局服。我一直安慰自己,他們只是感情好屡律,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布腌逢。 她就那樣靜靜地躺著降淮,像睡著了一般超埋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佳鳖,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天霍殴,我揣著相機(jī)與錄音,去河邊找鬼系吩。 笑死来庭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穿挨。 我是一名探鬼主播月弛,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼科盛!你這毒婦竟也來(lái)了帽衙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贞绵,失蹤者是張志新(化名)和其女友劉穎厉萝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榨崩,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴垫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了母蛛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩剪。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彩郊,靈堂內(nèi)的尸體忽然破棺而出肢专,到底是詐尸還是另有隱情,我是刑警寧澤焦辅,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布博杖,位于F島的核電站,受9級(jí)特大地震影響筷登,放射性物質(zhì)發(fā)生泄漏剃根。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一前方、第九天 我趴在偏房一處隱蔽的房頂上張望狈醉。 院中可真熱鬧廉油,春花似錦、人聲如沸苗傅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渣慕。三九已至嘶炭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逊桦,已是汗流浹背眨猎。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留强经,地道東北人睡陪。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匿情,于是被迫代替她去往敵國(guó)和親兰迫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361