Trie樹 字典樹(字串排序)

2021-07-14 12:39:03 字數 1205 閱讀 4659

有時,我們會碰到對字串的排序,若採用一些經典的排序演算法,則時間複雜度一般為o(n*lgn),但若採用trie樹,則時間複雜度僅為o(n)。

trie樹又名字典樹,從字面意思即可理解,這種樹的結構像英文本典一樣,相鄰的單詞一般字首相同,之所以時間複雜度低,是因為其採用了以空間換取時間的策略。

下圖為乙個針對字串排序的trie樹(我們假設在這裡字串都是小寫字母),每個結點有26個分支,每個分支代表乙個字母,結點存放的是從root節點到達此結點的路經上的字元組成的字串。

將每個字串插入到trie樹中,到達特定的結尾節點時,在這個節點上進行標記,如插入"afb",第乙個字母為a,沿著a往下,然後第二個字母為f,沿著f往下,第三個為b,沿著b往下,由於字串最後乙個字元為'\0',因而結束,不再往下了,然後在這個節點上標記afb.count++,即其個數增加1.

之後,通過前序遍歷此樹,即可得到字串從小到大的順序。

實現**如下(g++、vc++都編譯通過):

1 #include 2 #include 

3using

namespace

std;45

#define num 2667

class

node8;

1516

class

trie17;

2526

//程式未考慮delete動態記憶體

27int

main()

2856

57node::node()

5865

66trie::trie()

6770

71void trie::insert(char*str)

7295

else

9699 i++;

100}

101 parent->count++;

102}

103104

//採用前序遍歷

105void trie::output(node* &node, char** str, int&count)

106114

for(int i = 0; i < num; i++)

115118

119}

120 }

Trie樹 字典樹 字串排序

有時,我們會碰到對字串的排序,若採用一些經典的排序演算法,則時間複雜度一般為o n lgn 但若採用trie樹,則時間複雜度僅為o n trie樹又名字典樹,從字面意思即可理解,這種樹的結構像英文本典一樣,相鄰的單詞一般字首相同,之所以時間複雜度低,是因為其採用了以空間換取時間的策略。下圖為乙個針對...

字串 Trie樹(字典樹)

關於這個字串的資料結構我就不多說什麼了,不知道的可以戳這裡.trie樹在oi中應用廣泛,時間優秀,缺點就是空間占用大。下文中我們將字符集大小稱為 k,模式串長度為p trie支援o np 建樹,o p 插入,查詢,刪除。可是如果二維陣列儲存的話,就要耗費kn 的空間,基本無法承受。空間上我們可以用指...

字串 Trie字典樹

目錄 trie字典樹 例題 1.什麼是字典樹?2.字典樹的作用及性質 3.建樹 code 效果圖 4.查詢 code 5.優勢 6.回到例題 code 7.結束語 8.練習 給出n個字串,以及m個詢問。每次詢問讀入乙個字串,求該字串是多少個字串的字首 每個字串長度小於10 2,n和m小於10 5。樣...