您的位置:首页 > 其它

Trie Tree匹配算法实现

2017-10-11 14:18 197 查看
问题描述:给定一个字符串集合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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: