Trie樹及其應用

2021-07-08 11:09:42 字數 2835 閱讀 2182

一,知識簡介

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

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

trie樹的特點:

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

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

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

trie樹插入過程,以字母樹為例,對於乙個單詞,從根開始沿著對應的各個子樹節點分支向下遍歷,知道單詞遍歷結束,對最後乙個節點做標記,表示該單詞已插入到trie中;

trie樹查詢過程,類似插入過程,從根節點開始按照單詞的字母順序向下遍歷,直到某乙個節點標記不存在或者單詞遍歷結束而最後節點並沒有單詞結束標記,查詢結束,表示該單詞不存在;若最後節點有標記,表示該單詞存在。

二,trie樹的資料結構

trie

節點結構,如圖所示:

next是乙個指標陣列,指向各個孩子節點的指標。

簡單介紹乙個插入過程,給定幾個字串:b

abcabd

bcdabcd

efghii,

所構建的的trie樹如圖所示:

現在又來乙個單詞

abe,我們首先從根節點開始查詢,a這條邊存在,查詢第二個字母,b這條邊也存在,接著查詢第三個字母e,發現,不存在e這條邊,我們就要在節點b的孩子節點中插入節點e,並對節點e作標記,表示單詞abe已插入。

三,trie樹操作

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

1、插入

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

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

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

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

exist

置為true。

2、查詢

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

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

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

3、刪除

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

四,trie樹應用

(1)給定n個平均長度為len的單詞,判斷是否存在某乙個為另乙個的字首子串,下面是三種解決方法: 

(2)對n個單詞進行字典序排序,解決方法:把n個單詞讀入字典樹,然後先序遍歷字典樹即可。

實現**:

#include "stdafx.h"

#include "trie.h"

#include "trienode.h"

#include#includeusing namespace std;

trie::trie(void)

trie::~trie(void)

trienode* trie::creattrie()//構建字典樹根節點

void trie::trie_insert(trienode* root, string str)//插入字串

p = p->next[str.at(i)-'a'];

p->count += 1;

++i;

} p->exist = true;

}void trie::trie_search(trienode* root, string str)//查詢字串

else

{ cout<

cout<

trie樹的應用

現有乙個 n 個點的完全圖,點編號為1 到 n。另給出乙個長度為n 的序列 ai 完全圖中第 i 個點與第j 個點間的邊的邊權為 ai aj,其中 表示按位異或運算。請您找出該完全圖的最小生成鏈。由於答案可能很多,您只需輸出這條最小生成鏈中邊權最大的邊的邊權即可。這道題可以想到乙個性質,就是在比較兩...

Trie樹分析及其查詢的實現

trie樹是在查詢問題中以空間換取時間的做法,時間複雜度為o n 所以存在空間的大量消耗。本文trie樹的應用便是查詢某個詞綴在字典中出現的頻率。1 根節點不儲存任何字元 2 以某乙個字串結束標誌節點為止,根節點至該節點所構成的路徑內所有節點字元順序構成乙個字串 3 節點的所有子節點應包含不同的字元...

Trie樹 髒詞過濾應用

當前的 還只是進行簡單的替換,並沒有做一些字元的處理,比如 昨天見到你媽,逼我要買房 這本身不是髒詞,因為有逗號,所以程式裡要增加字元的範圍判斷。程式中的skip就是用來過濾髒詞的簡單變體,比如 找 小 姐 預設是最多跳過3個字元,這個可以隨便調整了。總之是乙個trie的鍛鍊吧。public cla...