模式匹配-BF、KMP、JavaString.indexOf、BM大比拼

闲来无事,比比看。

/**

* 模式匹配-BF、KMP、JavaString.indexOf、BM大比拼

*/

package javay.test;

import javay.util.PMBF;

import javay.util.PMBM;

import javay.util.PMKMP;

/**

* 模式匹配-BF、KMP、JavaString.indexOf、BM大比拼

* @author DBJ

*/

public class TestPM {

/**

* @param args

*/

public static void main(String[] args) {

/* 创建 目标串 */

StringBuffer buf = new StringBuffer();

long start_001 = System.currentTimeMillis();

for (int i = 0; i < 10000000; i ++) {

buf.append("abace");

}

buf.append("abcde");

String src = buf.toString();

long end_001 = System.currentTimeMillis();

System.out.println("创建目标串消耗的时间:" + (end_001 - start_001) + "毫秒");

/* 创建 模式串 */

String ptn = "abcde";

int pos = -1;

/* Brute-Force */

long start_01 = System.currentTimeMillis();

pos = PMBF.patternMatch(src, ptn);

long end_01 = System.currentTimeMillis();

System.out.println("BF 消耗的时间:" + (end_01 - start_01) + "毫秒");

System.out.println(pos);

/* Knuth-Morris-Pratt */

long start_02 = System.currentTimeMillis();

pos = PMKMP.patternMatch(src, ptn);

long end_02 = System.currentTimeMillis();

System.out.println("KMP消耗的时间:" + (end_02 - start_02) + "毫秒");

System.out.println(pos);

/* String */

long start_03 = System.currentTimeMillis();

pos = src.indexOf(ptn);

long end_03 = System.currentTimeMillis();

System.out.println("indexOf消耗的时间:" + (end_03 - start_03) + "毫秒");

System.out.println(pos);

/* Boyer-Moore */

long start_05 = System.currentTimeMillis();

pos = PMBM.patternMatch(src, ptn);

long end_05 = System.currentTimeMillis();

System.out.println("BM 消耗的时间:" + (end_05 - start_05) + "毫秒");

System.out.println(pos);

}

}

结果:

创建目标串消耗的时间:1248毫秒

BF 消耗的时间:1062毫秒

50000000

getNext消耗的时间:0毫秒

KMP1消耗的时间:874毫秒

KMP消耗的时间:874毫秒

50000000

indexOf消耗的时间:313毫秒

50000000

BM 消耗的时间:218毫秒

50000000

Java的String不错呀。

时间: 2024-10-09 22:56:08

模式匹配-BF、KMP、JavaString.indexOf、BM大比拼的相关文章

数据结构例程——串的模式匹配(KMP算法)

本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(KMP算法). 问题:串的模式匹配 KMP算法: #include <stdio.h> #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值*/ { int j,k; j=0; k=-1; next[0]=-1; while (j<t.length-1) { if (k==-1 || t.data[j]==t.d

常用算法3 - 字符串查找/模式匹配算法(BF &amp; KMP算法)

相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟海的文本中正确匹配到我们所需要的字符串呢?这就牵扯到了模式匹配算法! 1. 模式匹配 什么是模式匹配呢? 模式匹配,即子串P(模式串)在主串T(目标串)中的定位运算,也称串匹配 假设我们有两个字符串:T(Target, 目标串)和P(Pattern, 模式串):在目标串T中查找模式串T的定位过程,称

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

Implement strStr()&amp;BF&amp;KMP

Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 思路:时间复杂度O(m*n),也就是BF(Brute Force)算法: code: class Solution { public: char *strStr(char *haystack, char *needle) { if(!*need

模式匹配的KMP 算法

常见的字符串匹配时,模式串长度为n,源串长度为m,则从头匹配,两个指针i指向源串,j指向模式串,如遇到不同则回溯使j=0,这样就要反复匹配会使效率变低. 因为在如今i之前 的模式串与匹配串的匹配是同样的,即回溯时,不用将模式串与源串进行匹配,而仅仅将模式串与自身匹配就可以得到其是否须要回溯以及回溯到何处.则我们能够在进行模式匹配之前,想对模式串进行自我匹配,来计算出对于i在模式串的任何位置匹配失败后回溯的位置. 而对于自身匹配的算法另一个优化的地方在于,模式串在b位置匹配到自身的a位置,然后推断

模式匹配的KMP算法详解

这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法.大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白. 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考<数据结构>中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length

模式匹配-BF算法

/***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; #define MAXSTRLEN 255 //用户可在255以内定义最长串长 typedef char SString[MAXSTRLEN+1]; //0号单元存放串的长度 Status StrAs

模式匹配之Kmp算法

Kmp: 算法定义借鉴wikipedia: http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm#KMP_algorithm 代码: import java.util.Scanner; public class Main { public static void main(String[] argv){ Main u = new Main(); Scanner in = new Scanner(Syst

KMP 解决串的模式匹配问题

首先贴三段代码,一组是回溯法,暴力求解,另外两个是KMP串模式匹配 /* 回溯法字符串匹配算法就是用一个循环来找出所有有效位移, 该循环对n-m+1个可能的位移中的每一个index值,检查条件为P[0-m-1]= S[index-index+m-1] (因为模式串的长度是m,索引范围为0-m-1).该算法思维比较简单(但也常被一些公司做为面试题), 很容易分析出本算法的时间复杂度为O(pattern_length*target_length) int search(char const*, in