Tire樹(字典樹)

2021-10-19 01:25:52 字數 2783 閱讀 3829

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

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

它有3個基本性質:

舉個在網上流傳頗廣的例子,如下:

題目:給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,求第一次出現在第幾個位置。

分析:這題當然可以用hash來解決,但是本文重點介紹的是trie樹,因為在某些方面它的用途更大。比如說對於某乙個單詞,我們要詢問它的字首是否出現過。這樣hash就不好搞了,而用trie還是很簡單。

現在回到例子中,如果我們用最傻的方法,對於每乙個單詞,我們都要去查詢它前面的單詞中是否有它。那麼這個演算法的複雜度就是o(n^2)。顯然對於100000的範圍難以接受。現在我們換個思路想。假設我要查詢的單詞是abcd,那麼在他前面的單詞中,以b,c,d,f之類開頭的我顯然不必考慮。而只要找以a開頭的中是否存在abcd就可以了。同樣的,在以a開頭中的單詞中,我們只要考慮以b作為第二個字母的,一次次縮小範圍和提高針對性,這樣乙個樹的模型就漸漸清晰了。

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

當時第一次看到這幅圖的時候,便立馬感到此樹之不凡構造了。單單從上幅圖便可窺知一二,好比大海搜人,立馬就能確定東南西北中的到底哪個方位,如此迅速縮小查詢的範圍和提高查詢的針對性,不失為一創舉。

ok,如上圖所示,對於每乙個節點,從根遍歷到他的過程就是乙個單詞,如果這個節點被標記為紅色,就表示這個單詞存在,否則不存在。

那麼,對於乙個單詞,我只要順著他從根走到對應的節點,再看這個節點是否被標記為紅色就可以知道它是否出現過了。把這個節點標記為紅色,就相當於插入了這個單詞。

這樣一來我們查詢和插入可以一起完成(重點體會這個查詢和插入是如何一起完成的,稍後,下文具體解釋),所用時間僅僅為單詞長度,在這乙個樣例,便是10。

我們可以看到,trie樹每一層的節點數是26^i級別的。所以為了節省空間。我們用動態鍊錶,或者用陣列來模擬動態。空間的花費,不會超過單詞數×單詞長度。

#define max 26

typedef

struct trie trie;

node是表示每層有多少種類的數,如果只是小寫字母,則26即可,若改為大小寫字母,則是52,若再加上數字,則是62了,這裡根據題意來確定。

v可以表示乙個字典樹到此有多少相同字首的數目,或者表示乙個單詞的結束。這裡根據需要應當學會自由變化。

int

bulid_trie

(trie *

*root,

const

char

*str)

trie *p =

*root;

slen =

strlen

(str)

;for

(i =

0; i < slen; i ++

) p = p->node[index]

; p->v ++;}

return0;

}

int

find_trie

(trie *root,

const

char

*str)

return p->v;

}

#include

#include

#include

#define max 26

typedef

struct trie trie;

trie *root;

trie *

create_node()

else

return

null

;return node;

}int

bulid_trie

(trie *

*root,

const

char

*str)

trie *p =

*root;

slen =

strlen

(str)

;for

(i =

0; i < slen; i ++

) p = p->node[index]

; p->v ++;}

return0;

}int

find_trie

(trie *root,

const

char

*str)

return p->v;

}int

free_trie

(trie *root)

free

(root);}

return0;

}int

main()

;for

(i =

0; i <

6; i ++

)int v =

find_trie

(root,

"abc");

printf

(">>>>v: %d\n"

, v)

;free

(root)

;return0;

}

Tire樹(字典樹)的基本操作

tire樹的基本原理 tire樹是一種樹形結構,因其是詞典的一種儲存方式,故又叫字典樹。詞典中的每乙個單 詞在tire樹中表現為一條從根結點出發的路徑,路徑邊 上的點連起來就是一顆tire樹,如右圖 tire樹的基本性質可以歸納為 1 根結點不包含字元,其他的每乙個節點只包含乙個字元 2 從根結點到...

海量資料處理之Tire樹(字典樹)

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

海量資料處理之Tire樹(字典樹)

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