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.
一些多模式匹配算法如: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.
相关文章推荐
- Trie (prefix tree) 实现 (Java)
- 模式匹配算法以及KMP的javascript实现
- KMP模式匹配算法 C++实现
- 利用STL栈实现括号匹配算法
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- SIFT特征点匹配中KD-tree与Ransac算法的使用
- 【LeetCode-面试算法经典-Java实现】【098-Validate Binary Search Tree(验证二叉搜索树)】
- poj2446 Chessboard 二分图最大匹配 思考 匈牙利算法BFS实现
- BM模式匹配算法-实现(C语言)(转)
- KMP模式匹配算法实现
- BM模式匹配算法-实现(C语言)
- 圆投影匹配算法描述及实现
- [CodeProject每日一荐]实现Double Metaphone语音匹配算法[一]:介绍与C++实现
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 多模匹配算法与dictmatch实现
- [算法]Gale-Shapley Algorithm-稳定匹配算法的设计、实现与探讨(上)
- KMP模式匹配算法原理分析、next数组优化及java实现
- UVA 10092 The Problem with the Problemsetter【二分图最大匹配变形 邻接矩阵实现最大匹配算法】
- JDK源代码研究 TreeSet TreeMap 红黑树算法实现
- 基于边界的模板匹配的原理及算法实现