trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。
trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。
它有3個基本性質:
1.根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。
2.從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。
3.每個節點的所有子節點包含的字元都不相同。
trie樹常常用來進行字串匹配,字首匹配,它主要實現以下四個函式
字典樹的結點可以這麼設
public
class trienode
其中幾個變數所代表的意義分別是:
path:代表有經過這個結點的單詞數量
end:代表以這個結點結尾的單詞數量
map:是乙個雜湊結構,key代表某個結點的值,字母,數字等等,value是相應的結點物件,在對單詞構建字典樹的時候,可以用乙個26長度的陣列表示
下面以單詞的查詢建立字典樹為例,分別講一下每個方法的具體實現。
1. void insert(string word)
演算法思路:遍歷單詞每個字元,從根節點往下找,如果結點存在,則該結點path++,若不存在,增加乙個結點,path++,遍歷完後,最後乙個結點end++。
public
void insert(string word)
node.end++;
}
2.void search(string word)
演算法思路:遍歷單詞每個字元,若發現某結點不存在,直接返回false。遍歷完後,檢驗最後乙個節點的end值,若end==0,沒有單詞以這個字元結尾,返回false,若end!=0,說明有單詞以這個結尾,返回true。
public
boolean search(string word)
if(node.end == 0)
return
false;
return
true;
}
3.void delete(string word)
演算法思路:先用search檢查單詞是否存在,若不存在,直接返回,若存在,遍歷單詞,經過的每個結點path–,若path為1,則將後面的結點截斷(設為null),最後乙個結點end–。
public
void delete(string word)
node = node.map[index];
}node.end--;
}
4.int prefixnumber(string pre)
演算法思路:和search類似,找到最後乙個字元的時候,返回path的值,若未找到結點,返回0。
public
int prefixnumber(string pre)
return node.path;
}
1、有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
end變數的值就代表了詞頻了,構建trie的時候用乙個最小堆維護top100的詞彙,字典樹是比用hashmap儲存詞頻更節省空間的,因為字典樹的結點會復用
2、1000萬字串,其中有些是重複的,需要把重複的全部去掉,保留沒有重複的字串。請怎麼設計和實現?
構建trie樹,search可以找到字串是否存在,刪掉重複的就可以了
3、 乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間複雜度分析。
同第一題
4、尋找熱門查詢:搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個記錄,這些查詢串的重複讀比較高,雖然總數是1千萬,但是如果去除重複和,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
(1) 請描述你解決這個問題的思路;
(2) 請給出主要的處理流程,演算法,以及演算法的複雜度。
思路同第一題,有空再補重點內容
參考部落格:
trie樹 字典樹 java實現
public class trie public void insert string word else current.count current.isend true 怎麼判斷單詞是否存在?被判斷的單詞的字母與根節點下的子節點的字母進行比較,直到匹配到兩者最後乙個字母相同,並且最後乙個節點的i...
Trie樹(字典樹)的C 實現
trie樹,又稱字典樹 單詞查詢樹 字首樹,是一種雜湊樹的變種,應用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。優點是查詢快,利用字串的公共字首來節省儲存空間,最大限度的減少無謂的字串比較。對於長度為m的鍵值,最壞情況下只需花費o m 的時間 而bst需要o mlogn 的時間。leet...
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...