trie树和后缀树的应用
Trie樹(shù),即字典樹(shù),又稱單詞查找樹(shù)或鍵樹(shù),是一種樹(shù)形結(jié)構(gòu),是一種哈希樹(shù)的變種。典型應(yīng)用是用于統(tǒng)計(jì)和排序大量的字符串(但不僅限于字符串),所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計(jì)。它的優(yōu)點(diǎn)是:最大限度地減少無(wú)謂的字符串比較,查詢效率比哈希表高。Trie的核心思想是空間換時(shí)間。利用字符串的公共前綴來(lái)降低查詢時(shí)間的開(kāi)銷以達(dá)到提高效率的目的。
trie樹(shù)的應(yīng)用:
1.有一個(gè)1G大小的一個(gè)文件,里面每一行是一個(gè)詞,詞的大小不超過(guò)16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100個(gè)詞。
2.1000萬(wàn)字符串,其中有些是重復(fù)的,需要把重復(fù)的全部去掉,保留沒(méi)有重復(fù)的字符串。請(qǐng)?jiān)趺丛O(shè)計(jì)和實(shí)現(xiàn)?
3.一個(gè)文本文件,大約有一萬(wàn)行,每行一個(gè)詞,要求統(tǒng)計(jì)出其中最頻繁出現(xiàn)的前10個(gè)詞,請(qǐng)給出思想,給出時(shí)間復(fù)雜度分析。
4.尋找熱門查詢:搜索引擎會(huì)通過(guò)日志文件把用戶每次檢索使用的所有檢索串都記錄下來(lái),每個(gè)查詢串的長(zhǎng)度為1-255字節(jié)。假設(shè)目前有一千萬(wàn)個(gè)記錄,這些查詢串的重復(fù)讀比較高,雖然總數(shù)是1千萬(wàn),但是如果去除重復(fù)和,不超過(guò)3百萬(wàn)個(gè)。一個(gè)查詢串的重復(fù)度越高,說(shuō)明查詢它的用戶越多,也就越熱門。請(qǐng)你統(tǒng)計(jì)最熱門的10個(gè)查詢串,要求使用的內(nèi)存不能超過(guò)1G。
后綴樹(shù)的應(yīng)用:
1.查找字符串O是否在字符串S中。
方案:用S構(gòu)造后綴樹(shù),按在trie中搜索字串的方法搜索O即可。
原理:若O在S中,則O必然是S的某個(gè)后綴的前綴。
例如:leconte,查找O:con是否在S中,則O(con)必然是S(leconte)的前綴。
2.指定字符串T在字符串S中的重復(fù)次數(shù)。
方案:用S+’$’構(gòu)造后綴樹(shù),搜索T節(jié)點(diǎn)下的葉子節(jié)點(diǎn)數(shù)目即為重復(fù)次數(shù)
原理:如果T在S中重復(fù)了兩次,則S應(yīng)有兩個(gè)后綴以T為前綴,重復(fù)次數(shù)自然統(tǒng)計(jì)出來(lái)了。
3.字符串S中的最長(zhǎng)重復(fù)子串
方案:原理同2,具體做法是找到最深的非葉子節(jié)點(diǎn)。
這個(gè)深指從root所經(jīng)歷過(guò)的字符個(gè)數(shù),最深非葉子節(jié)點(diǎn)所經(jīng)歷的字符串起來(lái)就是最長(zhǎng)重復(fù)子串。為什么非要是葉子節(jié)點(diǎn)呢?因?yàn)榧热皇且貜?fù)的,當(dāng)然葉子節(jié)點(diǎn)個(gè)數(shù)要>=2
4.兩個(gè)字符串S1,S2的最長(zhǎng)公共子串(而非以前所說(shuō)的最長(zhǎng)公共子序列,因?yàn)樽有蛄惺遣贿B續(xù)的,而子串是連續(xù)的。)
方案:將S1#S2$作為字符串壓入后綴樹(shù),找到最深的非葉子節(jié)點(diǎn),且該節(jié)點(diǎn)的葉子節(jié)點(diǎn)既有#也有$.
5.最長(zhǎng)回文子串
轉(zhuǎn)載于:https://www.cnblogs.com/aiyelinglong/archive/2012/04/09/2439777.html
總結(jié)
以上是生活随笔為你收集整理的trie树和后缀树的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 01-UIScrollView01-大图
- 下一篇: (转)让思维活跃化的几个技巧