字典樹基礎(2018 1 23)

2021-08-14 22:23:53 字數 2194 閱讀 5984

/****************************字典樹trie模板***********************************/

#define max 26

struct

trie  

};  

trie root;  

void

trie_insert(trie *root,

char

*s)  

else

}  }  int

trie_search(trie *root,

char

*s)  

return

p->v;  

}  void

trie_delete(trie *root)  

free(root);  

}  /****************************字典樹trie模板***********************************/

int trie[1000010][26];    //陣列形式定義字典樹,值儲存的是下乙個字元的位置

int num[1000010]=;    //附加值,以某一字串為字首的單詞的數量

int pos = 1;

void insert(char word)    //在字典樹中插入某個單詞

}int find(char word)    //返回以某個字串為字首的單詞的數量

return num[c];}

開始先放上字典樹模板(兩組**);

trie樹的實現,可以用陣列,也可以用指標動態分配。

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

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

trie樹的基本性質可以歸納為:

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

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

每個節點的所有子節點包含的字串不相同。

trie樹有一些特性:

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

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

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

如果字元的種數為n,則每個結點的出度為n,這也是空間換時間的體現,浪費了很多的空間。

插入查詢的複雜度為o(n),n為字串長度。

基本思想(以字母樹為例):

插入過程

對於乙個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最後的節點標記為紅色,表示該單詞已插入trie樹。

查詢過程

同樣的,從根開始按照單詞的字母順序向下遍歷trie樹,一旦發現某個節點標記不存在或者單詞遍歷完成而最後的節點未標記為紅色,則表示該單詞不存在,若最後的節點標記為紅色,表示該單詞存在。

操作 在trie樹中主要有3個操作,插入、查詢和刪除。一般情況下trie樹中很少存在刪除單獨某個結點的情況,因此只考慮刪除整棵樹。

插入假設存在字串str,trie樹的根結點為root。i=0,p=root。

取str[i],判斷p->next[str[i]-97]是否為空,若為空,則建立結點temp,並將p->next[str[i]-97]指向temp,然後p指向temp; 

若不為空,則p=p->next[str[i]-97];

i++,繼續取str[i],迴圈1)中的操作,直到遇到結束符』\0』,此時將當前結點p中的 exist置為true。

查詢 假設要查詢的字串為str,trie樹的根結點為root,i=0,p=root

取str[i],判斷判斷p->next[str[i]-97]是否為空,若為空,則返回false;若不為空,則p=p->next[str[i]-97],繼續取字元。

重複1)中的操作直到遇到結束符』\0』,若當前結點p不為空並且 exist 為true,則返回true,否則返回false。

刪除(二選其一)

刪除可以以遞迴的形式進行刪除。

先搜尋後刪除

字典樹在判斷乙個單詞是否屬於字典時很有優勢,但是字典樹在判斷乙個文字包含多少個字典中的單詞時就顯得不足。字典樹基本上都是模板題。

Xor Sum (01字典樹)基礎的字典樹題目

初學字典樹的可以拿這道題練練手。題目大意 給你n個數,有m次詢問,每次給個數,問 這個數與n個數中的哪個數的異或值最大,輸出它。include include include using namespace std typedef int64 ll typedef long long ll cons...

Trie樹(字典樹)

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

字典樹 Trie樹

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