1. 程式人生 > >Trie Tree匹配演算法實現

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.