演算法 字典樹

2022-07-29 23:12:25 字數 1319 閱讀 5867

trie樹就是字典樹,其核心思想就是空間換時間。

字尾樹 suffix tree:

字典樹作用:

1、查詢單詞是否出現

2、查詢單詞第一次出現位置(在最後乙個字母節點標記第一次出現位置)

3、查詢包含前序的單詞個數(每新增乙個單詞進樹,所經過的節點的計數器加一)

4、將所有單詞按字母次序輸出

舉個簡單的例子。

給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。

這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對於某乙個單詞,我要詢問它的字首是否出現過。這樣hash就不好搞了,而用trie還是很簡單。

現在回到例子中,如果我們用最傻的方法,對於每乙個單詞,我們都要去查詢它前面的單詞中是否有它。那麼這個演算法的複雜度就是o(n^2)。顯然對於100000的範圍難以接受。現在我們換個思路想。假設我要查詢的單詞是abcd,那麼在他前面的單詞中,以b,c,d,f之類開頭的我顯然不必考慮。而只要找以a開頭的中是否存在abcd就可以了。同樣的,在以a開頭中的單詞中,我們只要考慮以b作為第二個字母的……這樣乙個樹的模型就漸漸清晰了……

假設有b,abc,abd,bcd,abcd,efg,hii這6個單詞,我們構建的樹就是這樣的。

對於每乙個節點,從根遍歷到他的過程就是乙個單詞,如果這個節點被標記為紅色,就表示這個單詞存在,否則不存在。

那麼,對於乙個單詞,我只要順著他從跟走到對應的節點,再看這個節點是否被標記為紅色就可以知道它是否出現過了。把這個節點標記為紅色,就相當於插入了這個單詞。

這樣一來我們詢問和插入可以一起完成,所用時間僅僅為單詞長度,在這乙個樣例,便是10。

我們可以看到,trie樹每一層的節點數是26^i級別的。所以為了節省空間。我們用動態鍊錶,或者用陣列來模擬動態。空間的花費,不會超過單詞數×單詞長度。

杭電amc 1251 ac code

class

node

bool

root;

void add(string str,list&trie);

int getprenum(string

pre);

};void node::add(string str, list&trie)

father->count++;

father=father->son[str[i]-'a'

]; }

father->count++;

}int node::getprenum(string

pre)

return p->count;

}

字典樹演算法

trie字典樹主要用於儲存字串,trie 的每個 node 儲存乙個字元。用鍊錶來描述的話,就是乙個字串就是乙個鍊錶。每個node都儲存了它的所有子節點。字典樹顧名思義是乙個樹形結構,它的建立和二叉樹類似。它可以實現字首搜尋。trie 樹利用字串的公共字首,逐層建立起一棵多叉樹。在檢索時類似於在字典...

演算法之字典樹

字典樹以字首訪問資料,就像檔案系統一樣,從根出發,只要知道某段資料的字首,就能找到相應的資料。同時,當存入新資料時,需建立新節點,然後將新資料依次插入對應字段。本例中字典樹以英文小寫字母的基礎資料。struct node node child 26 bool flag insert s,trie n...

trie樹 字典樹 DFA演算法

service public class sensitivewordutil extends timertask return else string strs keyword.split setkeywordset new hashset for string str strs sensitive...