Trie樹與AC演算法

2021-06-09 06:30:07 字數 1560 閱讀 8203

在我的前一篇博文《ac演算法--多模式匹配(**解析版)》(

)中介紹了ac演算法的實現原理,但是並沒有給出ac演算法的具體實現。ac演算法的實現必須首先解決幾個問題。首先需要解決的是goto表的實現問題。

由前面的分析可知,goto表本質上是乙個有限狀態機。儲存goto表的方式有很多,例如用二維陣列和鍊錶等。但是陣列的方式勢必造成空間的極大浪費,鍊錶會造成查詢效率的降低。綜合考慮儲存空間和執行效率,在實際應用中goto表一般是採用trie樹的形式進行儲存。

在電腦科學中中,trie,又稱字首樹,字典樹,是一種有序

樹,用於儲存

關聯陣列

,其中的鍵通常是

字串。與

二叉查詢樹

不同,鍵不是直接儲存在節點中,而是由節點在樹中的位置決定。乙個節點的所有子孫都有相同的

字首,也就是這個節點對應的字串,而根節點對應

空字串。一般情況下,不是所有的節點都有對應的值,只有葉子節點和部分內部節點所對應的鍵才有相關的值。

typedef struct trienode //trie結點宣告

trie;

void insert(trie *root,const char *s) //將單詞s插入到字典樹中

temp->isstr=false;

p->next[*s-'a']=temp;

p=p->next[*s-'a'];

}

else

s++;

} p->isstr=true; //單詞結束的地方標記此處可以構成乙個單詞

}

int search(trie *root,const char *s) //查詢某個單詞是否已經存在

return (p!=null&&p->isstr==true); //在單詞結束處的標記為true時,單詞才存在

}

void del(trie *root) //釋放整個字典樹佔的堆區空間

} free(root);

}

int main(int argc, char *argv)

root->isstr=false;

scanf("%d",&n);

getchar();

for(i=0;i

當然,trie樹除了應用在ac演算法中外,還有很多其他的應用。

trie樹的應用包括:

(1) 儲存字典;

(2)  應用在最大匹配演算法,例如拼寫檢查,斷詞等;

(3) 搜尋引擎中的詞頻統計;

(4) 樹中分支的先序遍歷結果就是字典序的;

字串演算法模板 Trie樹 AC自動機

trie樹 為ac自動機做鋪墊的乙個資料結構,trie用來找一段字串中字首出現在trie樹上的單詞,還有經典的xor問題 時間複雜度 o n o n o n include include using namespace std const int max 1e6 10 int trie max 2...

trie樹 字典樹 DFA演算法

service public class sensitivewordutil extends timertask return else string strs keyword.split setkeywordset new hashset for string str strs sensitive...

演算法程式設計 Trie樹(字典樹)

trie樹是一種非常簡單且有效的資料結構,其主要用於針對包含大量的字串,但所有字串包含字元型別數量較少的情況下,對字串的儲存。最典型的應用就是儲存單詞,因此也稱作字典樹。例如,給定幾個單詞,則可以用trie樹進行儲存 由上圖可知,trie樹具有幾個性質 注,樹中每乙個結點都是有唯一的編號 idx i...