Trie Tree匹配演算法實現
問題描述:給定一個字串集合S={“abc”,“gghh”,“yefbgj”},設計並實現一個演算法,在給定文字中找出這些字串的不連續出現(不連續出現,例如“abdcdshfkajhg”這個文字中就包含了“abc”)。
一些多模式匹配演算法如:AC演算法,WM演算法等,都是去尋找給定的文字中是否包含目標字串,例如在一個網頁中尋找多個敏感詞。然而,尋找的敏感詞必須在文字中是完整連續的。例如其中一個目標字串為“abbc”,那麼“acbbc”是無法檢測到的。為了去尋找一個非連續的目標字串,可以採用Trie樹,也叫做字首樹來實現。
首先利用字串集合S構建一個Trie樹。
集合currentnodes記錄了待匹配的所有節點,初始值為TrieTree的根節點的子節點。然後對於讀取到的每一個字元判斷是否在currentnodes集合中。如果不在則繼續判斷下一個。如果在,判斷是否是結束字元。如果不是結束字元,則將該節點從currentnodes移除,將它的子節點加入。如果是結束字元,則將該字元對應的字串新增到結果中。
Input1: TrieTree
Input2: targetFile
Set currentnodes = new Set(TrieTree);
int MAX_GAP=30;
while(targetfile.readChar.next!= null){
for node in currentnodes:
if targetfile.readChar.character == node.character && targetfile.readChar.order-node.order < MAX_GAP:
if node.isEnd:
find a discontinuous string string;
result.append(node.getString);
else:
currentnodes.remove(node);
currentnodes.addAll(node.childList);
}
output: result.