关于BF算法的理解——文本匹配算法
2015-05-20 16:50
501 查看
前几天在研究模板匹配的算法,接触了BF,KPM,BM,BMH,BMHS算法,所以就想来记录一下,顺便加强对算法的理解。如果理解有什么问题还请大家指正。
BF算法又称为朴素模式匹配算法,这是最简单的模式匹配算法。它的想法是很简单的,所以基本上和暴力匹配有点类似。
如图的匹配方式,用i作为记录模板匹配到文本的具体位置,用两个指针j和k进行字母配对,顺序从文本的头到尾遍历,首字母和尾字母相同则进行字母的匹配。以下是java实现的程序。
顺便提一句,java中的string.indexof()的实现源代码与此类似。
BF算法又称为朴素模式匹配算法,这是最简单的模式匹配算法。它的想法是很简单的,所以基本上和暴力匹配有点类似。
如图的匹配方式,用i作为记录模板匹配到文本的具体位置,用两个指针j和k进行字母配对,顺序从文本的头到尾遍历,首字母和尾字母相同则进行字母的匹配。以下是java实现的程序。
public int strStr(String haystack, String needle) { if(haystack == null || needle == null) return -1; if(haystack.equals("") && needle.equals("")) return 0; if(needle.equals("")) return 0; if(haystack.equals("")) return -1; char[] source = haystack.toCharArray(); char[] target = needle.toCharArray(); int source_len = haystack.length(); int target_len = needle.length(); if(source_len < target_len) return -1; if(source_len == target_len) { if(haystack.equals(needle)) return 0; else return -1; } char firstChar = target[0]; char lastChar = target[target_len - 1]; for(int i = target_len - 1; i < source_len; i++) { int j = i - target_len + 1; if(source[j] != firstChar) continue; if(source[i] != lastChar) continue; int k = 0; for(;j < i; j++,k++) { if(source[j] != target[k]) break; } if(j == i) return j - target_len + 1; } return -1; }如果想要测试是否正确,同时要保证数据量,可以去leetcode上进行测试,这是网址
顺便提一句,java中的string.indexof()的实现源代码与此类似。
相关文章推荐
- 关于KMP算法的理解——文本匹配算法
- 关于二分图最大匹配--匈牙利算法的理解
- 教材上关于模式匹配中的求next数组的算法不易理解,本人自己编写了一个具有相同功能的子函数
- 对于BMH算法的理解——文本匹配算法
- 关于KMP模式匹配算法的个人理解
- 关于字符串模式匹配算法的一点理解
- 对于BM算法的理解——文本匹配算法
- 文本比较算法剖析(2)-如何确定最优匹配路径
- Boyer-Moore文本匹配算法(联合使用KMP和Horspool算法)
- 关于遥感图像的控制点片匹配算法的一点想法(二)
- 串模式匹配算法-我的理解
- 关于《C语言程序设计现代方法》第15章例子“文本格式化”的理解
- KMP模式匹配算法详解(耐心看完定会理解)
- 数据结构(关于串的KMP匹配算法及其改进)
- 最近在做文本匹配,想到了特征值的算法,自己写了一个文本计算算法。求批判。
- 关于遥感图像的控制点片匹配算法的一点想法(二)
- 关于高亮显示括号匹配的算法(delphi)
- 关于普通低频PCB阻抗皮匹配的理解
- KMP模式匹配算法的两点理解
- 【数据结构与算法】模式匹配——从BF算法到KMP算法(附完整源码)