乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      看動畫輕松理解「Trie樹」

       樹悲風 2019-03-12

      Trie樹

      Trie這個名字取自“retrieval”,檢索,因為Trie可以只用一個前綴便可以在一部字典中找到想要的單詞。  

      雖然發(fā)音與「Tree」一致,但為了將這種 字典樹 與 普通二叉樹 以示區(qū)別,程序員小吳一般讀「Trie」尾部會重讀一聲,可以理解為讀「TreeE」。

      Trie樹,也叫“字典樹”。顧名思義,它是一個樹形結(jié)構(gòu)。它是一種專門處理字符串匹配的數(shù)據(jù)結(jié)構(gòu),用來解決在一組字符串集合中快速查找某個字符串的問題。

      此外Trie樹也稱前綴樹(因為某節(jié)點的后代存在共同的前綴,比如pan是panda的前綴)。

      它的Key都為字符串,能做到高效查詢和插入,時間復雜度為O(k),k為字符串長度,缺點是如果大量字符串沒有共同前綴時很耗內(nèi)存。

      它的核心思想就是通過最大限度地減少無謂的字符串比較,使得查詢高效率,即「用空間換時間」,再利用共同前綴來提高查詢效率。

      Trie樹的特點

      假設(shè)有5個字符串,它們分別是:Code,Cook,F(xiàn)ive,F(xiàn)ile,F(xiàn)at?,F(xiàn)在需要在里面多次查找某個字符串是否存在。如果每次查找,都是拿要查找的字符串跟這5個字符串依次進行字符串匹配,那效率就比較低,有沒有更高效的方法呢?

      如果將這5個字符串組織成下圖的結(jié)構(gòu),從肉眼上掃描過去感官上是不是比查找起來會更加迅速。

      Trie樹樣子

      通過上圖,可以發(fā)現(xiàn)Trie樹的三個特點:

      • 根節(jié)點不包含字符,除根節(jié)點外每一個節(jié)點都只包含一個字符。

      • 從根節(jié)點到某一節(jié)點,路徑上經(jīng)過的字符連接起來,為該節(jié)點對應的字符串。

      • 每個節(jié)點的所有子節(jié)點包含的字符都不相同。

      通過動畫理解Trie樹構(gòu)造的過程。在構(gòu)造過程中的每一步,都相當于往Trie樹中插入一個字符串。當所有字符串都插入完成之后,Trie樹就構(gòu)造好了。

      Trie 樹構(gòu)造

      Trie樹的插入操作

      Trie樹的插入操作

      Trie樹的插入操作很簡單,其實就是將單詞的每個字母逐一插入Trie樹。插入前先看字母對應的節(jié)點是否存在,存在則共享該節(jié)點,不存在則創(chuàng)建對應的節(jié)點。比如要插入新單詞Cook,就有下面幾步:

      • 插入第一個字母c,發(fā)現(xiàn)Root節(jié)點下方存在子節(jié)點c,則共享節(jié)點c。

      • 插入第二個字母o,發(fā)現(xiàn)c節(jié)點下方存在子節(jié)點o,則共享節(jié)點o。

      • 插入第三個字母o,發(fā)現(xiàn)o節(jié)點下方不存在子節(jié)點o,則創(chuàng)建子節(jié)點o。

      • 插入第三個字母k,發(fā)現(xiàn)o節(jié)點下方不存在子節(jié)點k,則創(chuàng)建子節(jié)點k。

      • 至此,單詞cook中所有字母已被插入Trie樹中,然后設(shè)置節(jié)點k中的標志位,標記路徑root->c->o->o->k這條路徑上所有節(jié)點的字符可以組成一個單詞Cook。

      Trie樹的查詢操作

      在Trie樹中查找一個字符串的時候,比如查找字符串code,可以將要查找的字符串分割成單個的字符c,o,d,e,然后從Trie樹的根節(jié)點開始匹配。如圖所示,綠色的路徑就是在Trie樹中匹配的路徑。

      code的匹配路徑

      如果要查找的是字符串cod(鱈魚)呢?還是可以用上面同樣的方法,從根節(jié)點開始,沿著某條路徑來匹配,如圖所示,綠色的路徑,是字符串cod匹配的路徑。

      但是,路徑的最后一個節(jié)點「d」并不是橙色的,并不是單詞標志位,所以cod字符串不存在。也就是說,cod是某個字符串的前綴子串,但并不能完全匹配任何字符串。

      cod的匹配路徑

      程序員不要當一條咸魚,要向 cook 靠攏:)。

      Trie樹的刪除操作

      Trie樹的刪除操作與二叉樹的刪除操作有類似的地方,需要考慮刪除的節(jié)點所處的位置,這里分三種情況進行分析:

      刪除整個單詞(比如hi

      刪除整個單詞

      • 從根節(jié)點開始查找第一個字符h。

      • 找到h子節(jié)點后,繼續(xù)查找h的下一個子節(jié)點i。

      • i是單詞hi的標志位,將該標志位去掉。

      • i節(jié)點是hi的葉子節(jié)點,將其刪除。

      • 刪除后發(fā)現(xiàn)h節(jié)點為葉子節(jié)點,并且不是單詞標志位,也將其刪除。

      • 這樣就完成了hi單詞的刪除操作。

      刪除前綴單詞(比如cod):

      刪除前綴單詞

      這種方式刪除比較簡單。

      只需要將cod單詞整個字符串查找完后,d節(jié)點因為不是葉子節(jié)點,只需將其單詞標志去掉即可。

      刪除分支單詞(比如cook):

      刪除分支單詞

      與 刪除整個單詞 情況類似,區(qū)別點在于刪除到cook的第一個o時,該節(jié)點為非葉子節(jié)點,停止刪除,這樣就完成cook。

      Trie樹的應用

      事實上Trie樹在日常生活中的使用隨處可見,比如這個:

      具體來說就是經(jīng)常用于統(tǒng)計和排序大量的字符串(但不僅限于字符串),所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計。

      它的優(yōu)點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。

      1. 前綴匹配

      例如:找出一個字符串集合中所有以五分鐘開頭的字符串。我們只需要用所有字符串構(gòu)造一個Trie樹,然后輸出以 五?>分?>鐘 開頭的路徑上的關(guān)鍵字即可。

      Trie樹前綴匹配常用于搜索提示。如當輸入一個網(wǎng)址,可以自動搜索出可能的選擇。當沒有完全匹配的搜索結(jié)果,可以返回前綴最相似的可能。

      Google搜索

      2. 字符串檢索

      給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,按最早出現(xiàn)的順序?qū)懗鏊胁辉谑煸~表中的生詞。

      檢索/查詢功能是Trie樹最原始的功能。給定一組字符串,查找某個字符串是否出現(xiàn)過,思路就是從根節(jié)點開始一個一個字符進行比較:

      • 如果沿路比較,發(fā)現(xiàn)不同的字符,則表示該字符串在集合中不存在。

      • 如果所有的字符全部比較完并且全部相同,還需判斷最后一個節(jié)點的標志位(標記該節(jié)點是否代表一個關(guān)鍵字)。

      Trie樹的局限性

      如前文所講,Trie的核心思想是空間換時間,利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。

      假設(shè)字符的種數(shù)有m個,有若干個長度為n的字符串構(gòu)成了一個Trie樹 ,則每個節(jié)點的出度為m(即每個節(jié)點的可能子節(jié)點數(shù)量為m),Trie樹的高度為n。

      很明顯我們浪費了大量的空間來存儲字符,此時Trie樹的最壞空間復雜度為O(m^n)。

      也正由于每個節(jié)點的出度為m,所以我們能夠沿著樹的一個個分支高效的向下逐個字符的查詢,而不是遍歷所有的字符串來查詢,此時Trie樹的最壞時間復雜度為O(n)。

      這正是空間換時間的體現(xiàn),也是利用公共前綴降低查詢時間開銷的體現(xiàn)。

      作者簡介:作者程序員小吳,哈工大學渣,目前正在學算法,開源項目 「 LeetCodeAnimation 」5500star,GitHub Trending 榜連續(xù)一月第一。歡迎大家關(guān)注我的微信公眾號:五分鐘學算法,一起學習,一起進步!

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多