字典樹 trie樹

2021-09-26 14:11:09 字數 2329 閱讀 5720

字典樹(trie 樹)

字典樹(trie樹)

字典樹是一種在字串查詢,字首匹配等方面應用廣泛的演算法,它在查詢字串時只與被查詢的字串長度有關,所以它在查詢時只有o(1)的時間複雜度,但隨之而來的較大的空間複雜度。

一.原理分析

二.分步實現

1.trie樹結構體定義

1 struct node

2 12 ~node()

13

21 }

22 }

23 };

24 node *head;

ps:被注釋掉部分是用建構函式初始化節點與使用析構函式刪除節點。

上圖**中的next[26]表示每個節點的下一層節點數量,小寫字母為26,加上大寫就是52,加上數字就是62,以此類推。而bool型的k則表示該位置是否有終止標記,可根據題意改變為其他標記。

2.字典樹的插入

1 void insert_ch(char *ch)

2 11 p -> k = true; //進行字串結尾標記

12 }

每次從根節點進行插入,如果向下的節點已經存在,就直接讀取,否則拓展乙個新節點。之後將最後乙個節點的k標記為true表示該位置有乙個字串結尾。

3.字串查詢

1 bool find_ch(char *ch)

2 11 return p -> k;

12 }

基本過程與插入相同,向下查詢,入過該節點不存在,直接返回false,如果存在一直向下查詢,最終返回末尾標記的k。

1.模板**

1 #include2 #include3 #include4 #include5 #include6 using namespace std;

7 struct node

8 19 }

20 ~node()

21

28 29 }

30 };

31 node *head;

32 void insert_ch(char *ch)

33 42 p -> k = true;

43 }

44 bool find_ch(char *ch)

45 54 return p -> k;

55 }

56 char ch[100];

57 int main()

58

三.另一種實現方式

動態分配記憶體對空間掌控很好,用乙個節點開闢乙個節點,但是在做題中有時會出現大大小小的問題不好結決,所以可以選擇另一種方法,直接開闢出乙個很大的結構體陣列用來儲存節點,不用考慮開闢與刪除節點問題。

1 #include2 #include3 #include4 #include5 #include6 using namespace std;

7 struct node

8 ;12 node no[10000000],*head;

13 int iii;

14 node *new_node()

15 22 p -> k = false;

23 }

24 void insert_ch(char *ch)

25 35 p = p->next[ch[i]-'a'];

36 }

37 p -> k = true;

38 }

39 bool find_ch(char ch)

40 49 return p -> k;

50 }

51 int main()

52 {

53 char s[100];

54 int i,n;

55 head = new_node();

56 while(~scanf("%d",&n))

57 {

58 iii=0;

59 for(i=0;i這種方法與上面的基本相同,只是節點不在用new開闢,而是直接從結構體陣列中取用,這種方法的弊端節點有最大值,當需要儲存的資料量過大時,會陣列越界。儲存資料量小時對空間的浪費也很嚴重。

四.相關基礎題目

hdoj 1251 統計難題:

hdoj 1671 phone list:

//用第一種方法記得釋放空間,否則超記憶體

hdoj 1247 hat』s words:

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...

字典樹 trie樹

amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...