資料結構之Trie樹

2021-07-25 04:05:59 字數 1790 閱讀 6345

1、什麼是trie樹

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。

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

它有3個基本性質:

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

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

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

2、trie樹的構建

本質上,trie是一顆儲存多個字串的樹。相鄰節點間的邊代表乙個字元,這樣樹的每條分支代表一則子串,而樹的葉節點則代表完整的字串。和普通樹不同的地方是,相同的字串字首共享同一條分支。舉乙個例子。給出一組單詞,inn, int, at, age, adv, ant, 我們可以得到下面的trie:

搭建trie的基本演算法很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則建立對應的節點和邊。比如要插入單詞add,就有下面幾步:

1.考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。

2.考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad

3.考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。

具體trie樹的建立、插入、查詢**如下所示:

//此函式只考慮26個英文本母的情況

#include

#include

using namespace std;

#define max_child 26

typedef struct tree

node,

*trie_node;

node* createtrie()/

/建立trie節點樹

void insert_node

(trie_node root

,char 

*str

)//trie樹插入結點

t=t-

>child[

*p-'a'];

p++;}

t->count++;

}void search_str(trie_node root,char *str)             //查詢串是否在該trie樹中

char *p=str;

node *t=root;

while

(*p!='\0'

)else

break;}if

(*p=='

\0')

else

cout<

<

"該字串不在trie樹中\n";}

void del(trie_node root)

//釋放整個字典樹佔的堆空間

free(root);}

int main(

)cout<

<

"trie樹已建立完成\n"

;cout<

<

"請輸入要查詢的字串:"

;while

(scanf(

"%s"

,str)!=

null

)return 0;}

基礎資料結構之trie樹

trie樹是一種實現字串快速檢索的多叉樹結構。把一堆字串壓縮到樹結構中構成trie樹,實現快速檢索。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。trie樹的題一般應用於 字首檢索 最大異或值 這類題。先把全部資料儲存到trie樹中,再遍歷每個資料,...

資料結構 TRIE樹

分類 data structure 2009 04 19 22 31 5425人閱讀收藏 舉報trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用h...

資料結構 TRIE樹

trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對於某乙個單詞,我要詢問它...