`
wudikua123
  • 浏览: 63057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

KMP与BF,实现了一个非主流next函数

 
阅读更多
#include <stdlib.h>
#include <string.h>

int bf(char* text, char* patten){
	int i = 0;
	int j = 0;
	while(i<strlen(text) && j<strlen(patten)){
		if(text[i] == patten[j]){
			i++;
			j++;
		}else{	
			//i回溯到 开始匹配的下一个位置 
			i = i-j+1;
			//j回溯到最开始0处 
			j = 0;
		}
	}
	//匹配到时候是j<strlen(patten)条件不满足的时候 
	return j>strlen(patten)-1 ? i-j : -1;
}

//在J位置发生不匹配以后,找到一个k使 P[0~K]==P[K+1~J]调整将J调整为K 
//这个方法也可以将next(j-1)求解出的子问题存储起来,这么写主要是为了好想 
int next(char* patten, int j){
	if(j==0||j==-1){
		return 0;
	}
	if(patten[j]==patten[next(patten, j-1)+1]){
		return next(patten, j-1)+1;
	}else{
		while(1){
			int k = next(patten, j-1);
			if(patten[j]==patten[k+1]){
				return next(patten, k);
			}
		}	
	}
}

int kmp(char* text, char* patten){
	int i = 0;
	int j = 0;
	while(i<strlen(text) && j<strlen(patten)){
		if(text[i] == patten[j] || j==0){
			i++;
			j++;
		}else{
			//j位置发生不匹配	
		    //j通过分析模式串,计算出模式串下一个比较位置和文本不匹配位置匹配 
			j = next(patten, j-1);
			
		}
	}
	return j>strlen(patten)-1 ? i-j : -1;
}

int main(){
	char* text =   "adjfskjfskdjsfkglsi";
	char* patten = "skdj";
	
	printf("%d\n",bf(text, patten));
	printf("%d\n",kmp(text, patten));
	return 0;
}

1
0
分享到:
评论

相关推荐

    KMP实现串定位精讲

    当主串中的一个字符与模式串中的字符不匹配时,KMP算法会根据之前已经匹配的部分来决定模式串的下一个比较位置,而不是简单地回退到主串的下一个字符。 1. **KMP算法的产生**: 传统的暴力匹配算法在遇到不匹配时...

    C++字符串匹配算法理解(从BF算法到KMP算法)

    kmp算法 字符串匹配算法理解(从BF算法到KMP算法) 暴风(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将...具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。

    数据结果 kmp算法实验报告

    在这个实现中,`KMPIndex`函数利用了预计算的`next`数组来避免不必要的回溯,提高了搜索效率。 ##### 任务二:实现串的替换功能 ```c int Replace(String S, int start, String T, String V) { int pos = BFIndex...

    KMP(字符串匹配)算法总结

    ### KMP(字符串匹配)算法总结 #### 第一部分:KMP...以上实现中,`buildNext`函数用于构建`next`数组,而`KMP`函数实现了KMP算法的核心逻辑。通过这种方式,KMP算法能够在最坏情况下以线性时间完成字符串匹配任务。

    模式匹配KMP算法C代码

    它主要用于在一个主串中查找一个模式串的位置,相比传统的模式匹配算法(如BF算法),KMP算法的最大优点在于它不会发生回溯,从而避免了重复计算,提高了匹配效率。 #### 核心概念与原理 在深入解析这段C语言代码...

    易语言源码易语言KMP算法模块源码

    在计算机科学领域,算法的设计与实现是极为重要的一个环节。KMP算法(Knuth-Morris-Pratt算法)作为字符串匹配算法中的经典之一,被广泛应用于文本处理、搜索引擎等领域。此次分享的是使用易语言实现的KMP算法模块...

    浅谈Python描述数据结构之KMP篇

    在这个实现中,`compute_next`函数用于生成Next数组,`KMP`函数则按照KMP算法进行匹配。KMP算法的时间复杂度是O(n + m),大大优于BF算法。 总之,KMP算法在字符串模式匹配中扮演着重要角色,尤其在处理大文本时,其...

    BFBM算法C语言实现

    从给定的代码片段来看,这是一段C语言程序,主要实现了三种字符串匹配算法:Boyer-Moore(BM)算法、Brute Force(BF)算法以及KMP算法。这段代码不仅展示了这些算法的实现,还通过实际输入的字符串进行了性能测试...

    数据结构:字符串存储操作:KMP模式匹配算法

    KMP算法通过预处理模式串来实现这一点,预处理的结果通常存储在名为next数组的结构中,这个数组记录了模式串中每个位置之前子串的最长相同前后缀的长度。 在KMP算法中,字符串的模式匹配过程是这样的:用模式串...

    字符串匹配的KMP算法浅析

    KMP算法的核心在于一个预处理过程,通过分析模式串W的特性,构建一个部分匹配表(也称为失败函数或next数组),用来在不匹配时决定W的下一个匹配位置,从而避免从文本的每个位置进行从头到尾的比较,提高了匹配效率...

    一种改进的字符串匹配算法

    KMP算法的核心在于如何高效地处理模式串(即需要匹配的字符串),通过构建一个next数组来记录模式串的部分匹配信息,当主串与模式串部分匹配失败时,可以根据这个数组快速定位下一个应该比较的位置,避免重复比较。...

    KMP算法字符串匹配算法介绍说明.docx

    通过预先计算失配函数,KMP算法能够在失配时快速定位到下一个可能的匹配起点,从而实现线性时间复杂度的字符串匹配。这种算法不仅理论价值高,而且在实际应用中也非常广泛,尤其是在文本检索、数据压缩等领域发挥着...

    c语言数据结构字符串模式匹配算法.zip

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...

    KMP 算法,即 Knuth-Morris-Pratt 算法,是一种用于字符串匹配的经典算法 与朴素的字符串匹配算法相比,KMP

    KMP 算法的核心在于构建一个**部分匹配表**(有时也称为失配函数或 next 数组)。该表用于记录模式串中的每一个前缀与后缀的最大公共长度,即最长匹配前缀长度。部分匹配表的构建过程是 KMP 算法最核心也是最复杂的...

    数据结构实验.zip

    (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法; (8)函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部...

    字符串的模式匹配详解–BF算法与KMP算法

     BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较...

    串的模式匹配参照.pdf

    代码使用C++编写,定义了一个串类,并实现了BF匹配和KMP匹配的函数。在主函数中,使用do-while循环显示菜单,根据用户输入的选项执行相应的操作。注意,这里使用了动态内存分配来存储Next数组,以适应不同长度的...

    数据结构串的操作实验报告.pdf

    2. **KMP(Knuth-Morris-Pratt)算法**:KMP算法通过预处理子串T,构建部分匹配表next数组,当匹配失败时,可以直接跳到next数组指定的位置,无需从主串的下一个字符开始比较,这样可以减少比较次数。 #### 程序...

    数据结构串实验报告.pdf

    程序清单中使用了C语言实现这些函数,定义了一个SqString结构体来存储串,其中包含一个字符数组data和一个表示串长度的整型变量length。通过引用型参数(即指针)来修改传入的串,提高了代码的效率和灵活性。 总的...

Global site tag (gtag.js) - Google Analytics