从X星球接收了一个数字信号序列。
现有一个已知的样板序列。需要在信号序列中查找它首次出现的位置。这类似于串的匹配操作。
如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了。可以仿照串的KMP算法,进行无回溯的匹配。这种匹配方法的关键是构造next数组。
next[i] 表示第i项比较失配时,样板序列向右滑动,需要重新比较的项的序号。如果为-1,表示母序列可以进入失配位置的下一个位置进行新的比较。
下面的代码实现了这个功能,请仔细阅读源码,推断划线位置缺失的代码。
// 生成next数组
int* make_next(int pa[], int pn)
{
int* next = (int*)malloc(sizeof(int)*pn);
next[0] = -1;
int j = 0;
int k = -1;
while(j < pn-1){
if(k==-1 || pa[j]==pa[k]){
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
return next;
}
// da中搜索pa, da的长度为an, pa的长度为pn
int find(int da[], int an, int pa[], int pn)
{
int rst = -1;
int* next = make_next(pa, pn);
int i=0; // da中的指针
int j=0; // pa中的指针
int n = 0;
while(i<an){
n++;
if(da[i]==pa[j] || j==-1){
i++;
j++;
}
else
__________________________; //填空位置
if(j==pn) {
rst = i-pn;
break;
}
}
free(next);
return rst;
}
int main()
{
int da[] = {1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
int pa[] = {1,2,1,1,2,1,1,1,2};
int n = find(da, sizeof(da)/sizeof(int), pa, sizeof(pa)/sizeof(int));
printf("%d\n", n);
return 0;
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)
j = next[j]
java实现第五届蓝桥杯信号匹配
原创
©著作权归作者所有:来自51CTO博客作者热爱学习的发呆哥的原创作品,请联系作者获取转载授权,否则将追究法律责任
信号匹配
上一篇:java实现第五届蓝桥杯信号匹配
下一篇:java实现第五届蓝桥杯信号匹配
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java实现第五届蓝桥杯猜字母
...
Java 第五届蓝桥杯 -
java实现第五届蓝桥杯供水设施
供水设施X星球的居民点很多。Pear决定修...
Java 第五届蓝桥杯 -
java实现第五届蓝桥杯排列序数
排列序数如果用a b c d这4个字母组成...
Java Java考题 -
java实现第五届蓝桥杯绳圈
绳圈题目描述今有 100 根绳子,当然会有...
Java 第五届蓝桥杯 -
java实现第五届蓝桥杯武功秘籍
武功秘籍小明到X山洞探险,捡到一本有破损的...
Java 第五届蓝桥杯 -
java实现第五届蓝桥杯猜年龄
猜年龄题目描述小明带两个妹妹参加元宵灯会。...
Java 第五届蓝桥杯 -
java实现第五届蓝桥杯LOG大侠
LOG大侠atm参加了速算训练班,经过刻苦...
i++ 数据 源文件 输出格式 #include -
less判断某个元素宽度大于
在写代码的时候要经常用的元素宽、高, 可以通过getComputedStyle(dom)["width"], 但是有点麻烦,dom提供了获取元素宽高值的快捷方式。 getComputedStyle 返
less判断某个元素宽度大于 JavaScript 元素尺寸 html 值类型