Basic Trie Tree

??Trie Tree 實際上是一種前綴樹丸卷。在自然語言處理中我們經(jīng)常需要進行詞的匹配蔚出、查詢等等操作汹粤。Trie Tree 實際就是對所有單詞的前綴進行合并射亏。例如 banana 和ban 實際上其存在共同前綴ban阀溶。Trie Tree的首要就是合并這些前綴從而達到高效匹配與統(tǒng)計。


基本簡介

如上所示Trie實際上是一個多路查找樹鸦泳,每個節(jié)點都有可能是一個潛在的單詞银锻。每個節(jié)點的定義我們可以簡略定義如下:

 struct  Node 
  {
      Node* children[26]
  }

cnt 表示該單詞出現(xiàn)次數(shù),如果0表示在該節(jié)點沒有單詞做鹰。children為指向下一集節(jié)點的指針击纬。

func insert(root, string, value):
    node = root
    index_last_char = None
    for index_char, char in enumerate(string):
        if char in node.children:
            node = node.children[char]
        else:
            index_last_char = index_char
            break
    if index_last_char is not None: 
        for char in string[index_last_char:]:
            node.children[char] = Node()
            node = node.children[char]
    node.value = value
func find(node, key):
    for char in key:
        if char in node.children:
            node = node.children[char]
        else:
            return None
    return node.value

如上為trie的插入和search的偽代碼實現(xiàn),很是簡單钾麸。不過前面說過了更振,性能、空間饭尝、往往都是矛盾肯腕。上述實現(xiàn)也不例外,其也就停留在學(xué)習(xí)入門教學(xué)的程度钥平。上圖我們已經(jīng)看到節(jié)點 atate因為只有單個子節(jié)點實際上是可以合并為ate一個.這也就是所謂的路徑壓縮实撒。有興趣的可以看下radix Tree實際上就是一種路徑壓縮。

應(yīng)用舉例
  1. 字符串檢索涉瘾,詞頻統(tǒng)計知态,搜索引擎的熱門查詢
    事先將已知的一些字符串(字典)的有關(guān)信息保存到trie樹里,查找另外一些未知字符串是否出現(xiàn)過或者出現(xiàn)頻率立叛。

    舉例:

    1负敏、有一個1G大小的一個文件,里面每一行是一個詞秘蛇,詞的大小不超過16字節(jié)其做,內(nèi)存限制大小是1M顶考。返回頻數(shù)最高的100個詞。

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

    3甚负、給出一個詞典,其中的單詞為不良單詞审残。單詞均為小寫字母梭域。再給出一段文本,文本的每一行也由小寫字母構(gòu)成搅轿。判斷文本中是否含有任何不良單詞病涨。例如,若rob是不良單詞璧坟,那么文本problem含有不良單詞既穆。

    4、1000萬字符串雀鹃,其中有些是重復(fù)的幻工,需要把重復(fù)的全部去掉,保留沒有重復(fù)的字符串黎茎。請怎么設(shè)計和實現(xiàn)囊颅?

    5、一個文本文件傅瞻,大約有一萬行踢代,每行一個詞,要求統(tǒng)計出其中最頻繁出現(xiàn)的前10個詞嗅骄,請給出思想胳挎,給出時間復(fù)雜度分析。

    6溺森、尋找熱門查詢:搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來慕爬,每個查詢串的長度為1-255字節(jié)。假設(shè)目前有一千萬個記錄儿惫,這些查詢串的重復(fù)讀比較高澡罚,雖然總數(shù)是1千萬,但是如果去除重復(fù)和肾请,不超過3百萬個。一個查詢串的重復(fù)度越高更胖,說明查詢它的用戶越多铛铁,也就越熱門隔显。請你統(tǒng)計最熱門的10個查詢串,要求使用的內(nèi)存不能超過1G(京東筆試題簡答題與此類似)饵逐。

    (1) 請描述你解決這個問題的思路括眠;

    (2) 請給出主要的處理流程,算法倍权,以及算法的復(fù)雜度掷豺。

  2. 字符串最長公共前綴
    Trie樹利用多個字符串的公共前綴來節(jié)省存儲空間,反之薄声,當(dāng)我們把大量字符串存儲到一棵trie樹上時当船,我們可以快速得到某些字符串的公共前綴。舉例:

    1. 給出N 個小寫英文字母串默辨,以及Q 個詢問德频,即詢問某兩個串的最長公共前綴的長度是多少. 解決方案:
      首先對所有的串建立其對應(yīng)的字母樹。此時發(fā)現(xiàn)缩幸,對于兩個串的最長公共前綴的長度即它們所在結(jié)點的公共祖先個數(shù)壹置,于是,問題就轉(zhuǎn)化為了離線(Offline)的最近公共祖先(Least Common Ancestor表谊,簡稱LCA)問題钞护。
  3. 排序
    Trie樹是一棵多叉樹,只要先序遍歷整棵樹爆办,輸出相應(yīng)的字符串便是按字典序排序的結(jié)果难咕。

    舉例:給你N 個互不相同的僅由一個單詞構(gòu)成的英文名,讓你將它們按字典序從小到大排序輸出押逼。

  4. 作為其他數(shù)據(jù)結(jié)構(gòu)和算法的輔助結(jié)構(gòu)
    如后綴樹步藕,AC自動機等。

上述問題一般都可以使用或者借助Trie來實現(xiàn)挑格。具體怎么處理大家自己可以慢慢思考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咙冗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漂彤,更是在濱河造成了極大的恐慌雾消,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挫望,死亡現(xiàn)場離奇詭異立润,居然都是意外死亡,警方通過查閱死者的電腦和手機媳板,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門桑腮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉幸,你說我怎么就攤上這事破讨〈曰蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵提陶,是天一觀的道長烫沙。 經(jīng)常有香客問我,道長隙笆,這世上最難降的妖魔是什么锌蓄? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮撑柔,結(jié)果婚禮上瘸爽,老公的妹妹穿的比我還像新娘。我一直安慰自己乏冀,他們只是感情好蝶糯,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辆沦,像睡著了一般昼捍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肢扯,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天妒茬,我揣著相機與錄音,去河邊找鬼蔚晨。 笑死乍钻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铭腕。 我是一名探鬼主播银择,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼累舷!你這毒婦竟也來了浩考?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤被盈,失蹤者是張志新(化名)和其女友劉穎析孽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只怎,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡袜瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了身堡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邓尤。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裁赠,到底是詐尸還是另有隱情殿漠,我是刑警寧澤赴精,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布佩捞,位于F島的核電站,受9級特大地震影響蕾哟,放射性物質(zhì)發(fā)生泄漏一忱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一谭确、第九天 我趴在偏房一處隱蔽的房頂上張望帘营。 院中可真熱鬧,春花似錦逐哈、人聲如沸芬迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禀梳。三九已至,卻和暖如春肠骆,著一層夾襖步出監(jiān)牢的瞬間算途,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工蚀腿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘴瓤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓莉钙,卻偏偏與公主長得像廓脆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磁玉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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

  • Trie Tree模樣 99%的情況下是用于存儲string, 又稱為前綴樹停忿,可以節(jié)省空間。還可以用于記錄詞頻時候...
    gyDBD閱讀 371評論 0 0
  • Trie 樹蜀涨,字典樹瞎嬉,try樹。Trie 根節(jié)點不存在字符厚柳。從根節(jié)點開始氧枣,每個節(jié)點都是一個字符,通過路徑連接起來别垮。...
    ibyr閱讀 1,566評論 0 0
  • 前言 繼上一篇HashMap實現(xiàn)中文分詞器后便监,對Trie Tree的好奇,又使用Trie Tree實現(xiàn)了下中文分詞...
    jijs閱讀 3,196評論 2 13
  • [Leetcode-421] Maximum XOR of Two Number in an Array? Giv...
    ibyr閱讀 608評論 0 0
  • 這個代碼有一個edge case沒過,不過大致上實現(xiàn)了一下Trie Tree的原理烧董。使用的是HashMap<Cha...
    98Future閱讀 344評論 0 0