字串 之字典樹 演算法

2021-06-17 20:31:48 字數 2156 閱讀 4625

trie樹|字典樹的簡介trie,又稱字典樹、單詞查詢樹,是一種樹形結構,用於儲存大量的字串,其核心思想是空間換時間。它的優點是:利用字串的公共字首來節約儲存空間。相對來說,trie樹是一種比較簡單的資料結構.理解起來比較簡單,正所謂簡單的東西也得付出代價.故trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹的話,可能會好點.

其基本性質可以歸納為:

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

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

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

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

搜尋字典專案的方法為:

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

其他操作類似處理.

舉個簡單的例子。

給你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個單詞,我們構建的樹就是這樣的

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

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

這樣一來我們詢問和插入可以一起完成,所用時間僅僅為單詞長度,在這乙個樣例,便是10。

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

c **

//=+

#include "stdio.h" 

#include "string.h" 

#include "stdlib.h" 

struct dictree 

; //結點結構,有26個子節點 

struct dictree *root; 

void insert (char *source) 

else 

} current->isword=true;//標識 單詞的最後乙個 字母為 單詞結尾

} int find(char *source) 

return current->n;//返回 所查詢的字首在 輸入的一組字串中出現的次數

/ bool 返回值判斷 給定 的單詞是否在之前輸入的詞庫

if(len==0) return false; 

current=root; 

for(i=0;i

return current->isword; 

/ } 

int main() 

字典樹的典型應用:

1.統計一組字串中某字首出現的次數(直接用上面的**就行)。

2.判斷一組字串中是否有乙個字串是另乙個字串的字首。

分析:我們只要在結點中新增乙個nendflag成員變數即可。若nendflag == 1,說明該結點字元是某一字串的結尾(假設為a),若在插入b字串的過程中經過這一結點,則說明a是b的 

字首;還有一種情況,當要插入最後乙個字元c時,卻發現p->next[c-'a']為真,則說明該字串是乙個字首字串,eg:先插入abcde,再插入abc這種情況。

3. 串排序:給定n個互不相同的僅由乙個單詞構成的英文名,讓你將他們按字典序從小到大輸出

用字典樹進行排序,採用陣列的方式建立字典樹,這棵樹的每個結點的所有兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷即可。

字串 字典樹

目錄樹的形態 樹根為空值,有26子節點 根據實際情況,可能具體問題不需要真實有。另外不同問題還可以擴充套件,比如加大小寫兼有的需要雙倍,但需要做好規定 而每乙個子節點另外又包含26個子節點,根據需要遞迴下去。功能 從樹根到某一結點的路徑可以代表乙個具體的字串。下面的展示了簡單的結構。題目 很多單詞有...

字串演算法 字典樹Trie入門

顧名思義,字典樹 也叫字首樹 就是可以像字典那樣來儲存一些單詞的集合。如圖所示 來自oiwiki 設根節點的標號為 0 然後其餘結點依次編號 我們用陣列來存每個節點的所有子節點 更具體地,設陣列 ch maxnode sigmasize 其中 maxnode 表示最大可能的節點個數,sigmasiz...

字串 Trie樹(字典樹)

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