Trie樹 字典樹 字串排序 簡介及實現

2022-09-27 05:45:08 字數 2432 閱讀 2737

1.綜述

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。

它的優點是:利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。

trie樹結構的優點在於:

1) 不限制子節點的數量;

2) 自定義的輸入序列化,突破了具體語言、應用的限制,成為乙個通用的框架;

3) 可以進行最大tokens序列長度的限制;

4) 根據已定閾值輸出重複的字串;

5) 提供單個字串頻度查詢功能;

6) 速度快,在兩分鐘內完成2023年1月份人民**(19056行)的重複字串抽取工作。

2.性質

它有3個基本性質:

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

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

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

3.基本操作

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

4.實現方法

搜尋字典專案的方法為:

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

(2) 取得要查詢關鍵詞的第乙個字母,並根據該字母選擇對應的子樹並轉到該子樹繼續進行檢索;

(3) 在相應的子樹上,取得要查詢關鍵詞的第二個字母,並進一步選擇對應的子樹進行檢索。

(4) 迭代過程……

(5) 在某個結點處,關鍵詞的所有字母已被取出,則讀取附在該結點上的資訊,即完成查詢。

其他操作類似處理

5. trie原理——trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。

6.**實現

複製** **如下:

const int branchnum = 26; //宣告常量

int i;

struct trie_node

};class trie

;trie::trie()

void trie::insert(const char* word)

location = location->next[*word-'a']; //每插入一步,相當於有乙個新串經過,指標要向下移動

word++;

}location->isstr = true; //到達尾部,標記乙個串

}bool trie::search(char *word)

return(location!=null && location->isstr);

}void trie::deletetrie(trie_node *root)

}deleteroot;

}void main() //簡單測試

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

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

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

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

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

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

複製** **如下:

#include

#include

using namespace std;

#define num 26

class node

;class trie

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

int main()

node::node()

trie::trie()

void trie::insert(char* str)

else

i++;

}parent->count++;

}//採用前序遍歷

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

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

}}

本文標題: trie樹_字典樹(字串排序)簡介及實現

本文位址:

Trie樹 字典樹(字串排序)

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

Trie樹 字典樹 字串排序

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

字串 Trie樹(字典樹)

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