暴力匹配、KMP和Sunday算法都是字符串的匹配算法,用c语言写一个根据输入,输出指定匹配算法的字符比较次数的代码
时间: 2024-10-27 19:09:46 浏览: 54
暴力匹配是最简单的一种算法,它直接从头开始逐个字符比较,直到找到匹配或遍历完整个字符串。虽然直观,但对于长字符串而言效率很低。
KMP(Knuth-Morris-Pratt)算法是一种改进的模式匹配算法,通过预处理模式串构建部分匹配表(也叫失配函数),避免了不必要的回溯。当遇到不匹配的情况时,会根据部分匹配表向前移动模式指针,而不是退回到前一个字符。
Sunday算法,实际上是KMP算法的一个变种,有时候也被称作“周日算法”,因为它名字来源于论文作者的名字排列顺序。它同样利用部分匹配表,但通常比标准KMP更简洁一些,因为它的部分匹配表计算过程更紧凑。
以下是用C语言分别实现暴力匹配和KMP算法计数字符比较次数的例子:
```c
#include <stdio.h>
// 暴力匹配字符比较次数
int brute_force_match(const char* text, const char* pattern) {
int count = 0;
for (int i = 0; i < strlen(text); ++i) {
if (text[i] == pattern[i]) {
count++;
} else {
break;
}
}
return count;
}
// KMP算法字符比较次数(使用部分匹配表)
void compute_lps(char* pattern, int lps[], int n) {
int len = 0;
lps[0] = 0;
for (int i = 1; i < n; ++i) {
if (pattern[i] == pattern[len]) {
len++;
lps[i] = len;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
}
}
}
}
int kmp_match(const char* text, const char* pattern) {
int count = 0, j = 0;
int lps[pattern_length]; // 需要知道模式长度
compute_lps(pattern, lps, pattern_length);
for (int i = 0; i < strlen(text); ++i) {
if (j > 0 && text[i] != pattern[j]) {
j = lps[j - 1];
}
if (text[i] == pattern[j]) {
j++;
count++;
}
}
return count;
}
int main() {
char text[] = "ABABCAB";
char pattern[] = "ABC";
printf("Brute Force: %d comparisons\n", brute_force_match(text, pattern));
printf("KMP: %d comparisons\n", kmp_match(text, pattern));
return 0;
}
```
在这个例子中,`brute_force_match`和`kmp_match`函数分别用于计算暴力匹配和KMP算法的字符比较次数。运行这个程序将输出每个算法的比较次数。
阅读全文