Trie樹 字典樹的簡介

2021-06-01 17:39:07 字數 2382 閱讀 3401

trie樹|字典樹的簡介

trie,又稱字典樹、單詞查詢樹,是一種樹形結構,用於儲存大量的字串,

其核心思想是空間換時間

。它的優點是:利用字串的公共字首來節約儲存空間。

相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹的話,可能會好點.

其基本性質可以歸納為:

1. 根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。 

2. 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串。 

3. 每個節點的所有子節點包含的字元都不相同。

其基本操作有:查詢 插入和刪除,當然刪除操作比較少見.我在這裡只是實現了對整個樹的刪除操作,至於單個word的刪除操作也很簡單.

搜尋字典專案的方法為:

(1) 從根結點開始一次搜尋;

(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級別的。所以為了節省空間。我們用動態鍊錶,或者用陣列來模擬動態。空間的花費,不會超過單詞數×單詞長度。

#include #include #include using namespace std;

const int num_chars = 26;

class trie ;

trie(trie& tr);

int search(const char* word, char* entry ) const;

int insert(const char* word, const char* entry);

int remove(const char* word, char* entry);

private:

struct trie_node

* root;

};trie::trie_node::trie_node()

if ( location != null && location->data != null )

else return 0;

}int trie::insert(const char* word, const char* entry)

//如果當前要插入的word在樹中已有 ,返回result=0;

if (location->data != null)

result = 0;

//如果不存在,進行如下操作

else

return result;

}int main()

{ trie t;

char entry[100];

t.insert("aa", "det");

t.insert("abacus","noun");

t.insert("abalone","noun");

t.insert("abandon","verb");

t.insert("abandoned","adj");

t.insert("abashed","adj");

t.insert("abate","verb");

t.insert("this", "pron");

if (t.search("this", entry))

cout<

Trie樹 字典樹的簡介及實現

trie,又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹...

Trie樹 字典樹的簡介及實現

trie,又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹...

Trie樹 字典樹的簡介及實現

trie,又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹...