字典樹及其C 實現

2021-09-17 03:27:37 字數 1762 閱讀 7281

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。

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

如上圖所示,對於每乙個節點,從根遍歷到他的過程就是乙個單詞,如果這個節點被標記為紅色,就表示這個單詞存在,否則不存在。那麼,對於乙個單詞,我只要順著他從根走到對應的節點,再看這個節點是否被標記為紅色就可以知道它是否出現過了。把這個節點標記為紅色,就相當於插入了這個單詞。這樣一來我們查詢和插入可以一起完成,所用時間僅僅為單詞長度,在這乙個樣例,便是10。我們可以看到,trie樹每一層的節點數是26^i級別的。所以為了節省空間。我們用動態鍊錶,或者用陣列來模擬動態。空間的花費,不會超過單詞數×單詞長度。

使用trie時,因為當查詢如字串abc是否為某個字串的字首時,顯然以b,c,d....等不是以a開頭的字串就不用查詢了。所以建立trie的複雜度為o(n*len),而建立+查詢在trie中是可以同時執行的,建立的過程也就可以成為查詢的過程,hash就不能實現這個功能。所以總的複雜度為o(n*len),實際查詢的複雜度也只是o(len)。(說白了,就是trie樹的平均高度h為len,所以trie樹的查詢複雜度為o(h)=o(len))。

優點:

缺點:

const int num = 26; //每個節點需要儲存26個字母

struct trienode

};class trie

void insert(string word);

bool search(string word);

void deletetrie(trienode* root);

private:

trienode* root;

};void trie::insert(string word)

location = location->next[word[i] - 'a'];

}location->isword = true;

}bool trie::search(string word)

void trie::deletetrie(trienode* root)

}delete root;

}void main() //簡單測試

string input;

cout << "輸入要檢查的單詞" << endl;

cin >> input;

cout << boolalpha << tree.search(input) << endl;//查詢是否存在是個單詞

}

字典樹及其應用

字典樹是一種比較特殊的樹,邊上有邊權 至少我是怎麼理解的 又名 trie 樹。大概長這樣 插入了cap,cat,csp,co,code 邊上是字符集,點上是點的編號,塗成藍色的代表是單詞的結尾。字符集可以是a z,0 9,true和false等等。字典樹有效的組織了單詞的關係,節省了時間和空間。vo...

Trie樹(字典樹)的C 實現

trie樹,又稱字典樹 單詞查詢樹 字首樹,是一種雜湊樹的變種,應用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。優點是查詢快,利用字串的公共字首來節省儲存空間,最大限度的減少無謂的字串比較。對於長度為m的鍵值,最壞情況下只需花費o m 的時間 而bst需要o mlogn 的時間。leet...

字典樹實現

字典樹,又稱單詞查詢樹,trie 樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。以下是 實現部分 字典樹clas...