KMP算法

1,关于模式串目标串的匹配过程,话不多说,先上图


上图中O为目标串,f为模式串,A,B为模式串中最长的可匹配的前缀,后缀。在i之前模式串与目标串是匹配的,i为失配位置。我们知道在模式串中B之前均与A部分不匹配,而这些部分都已与目标串匹配,故A部分不可能与B部分对齐的目标串的前面部分匹配,所以我们可以直接将模式串的A部分移到与目标串中与B部分匹配的部分。(即,目标串可以从匹配失败的地方开始重新匹配,而不必像朴素算法回退到与模式串匹配的第二个位置。模式串也可以根据前后缀的记录从前缀的后一个位置开始匹配)这就是kmp算法高效的原因。


2,有了前面的说明,我们知道记录模式串的模式(即该串中子串的重复情况(个人是这么理解的))是十分重要的。在此,我们引入一个next数组来记录。

show   the   code:


void getnext()
{
    int i,j;
    next[0]=0;
    for(i=1,j=0;s[i];i++){///j为next[i-1]
    	while(j>0&&s[i]!=s[j]){///寻找前缀
    		j=next[j-1];
		}
		if(s[i]==s[j])++j;///若与前缀匹配,则匹配长度+1
		next[i]=j;
	}
}

用一个例子来说明一下代码吧:

串:    a  b  c  d  e  f  g  a  b  c  d    a    b    c    e

下标:0  1  2  3  4  5 6  7  8  9  10  11  12  13  14

next: 0  0  0  0  0 0 0  1  2  3   4   1    2    3    0


我们从11号下标对应的位置来看,通过10号下标的next值我们找到了3号下标(在此之前j值为4,通过while循环,j值变为0)(因为next数组记录的是与前缀的匹配长度,而我们的数组下标是从0开始的,所以next数组在j-1位置的值即为串中需要查看是否与j位置的字符匹配的字符的下标),查看0号字符与11号字符是否一致,若一致则后缀长度+1.


kmp算法:


int kmp(char *w,char *t){
	int l1,l2,i,j,sum=0;
	l1=strlen(w);
	l2=strlen(t);
	for(i=0,j=0;i<l2;i++){
		if(l2-i<l1-j)break;
		while(j>0&&w[j]!=t[i]){
			j=next[j-1];
		}
		if(w[j]==t[i])++j;
		if(j==l1){
			sum++;
			j=next[j-1];
			continue;
		}
	}
	return sum;
}

物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值