用C++(1 ) 实现 BF 算法; (2 ) 实现 BF 算法的改进算法:KMP 算法和 BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析,并设计实验程序验证分析结果。
时间: 2024-09-25 15:13:30 浏览: 65
(1) 在C++中实现BF (Brute Force) 算法,也称为暴力搜索算法,用于在一个字符串数组中查找给定目标字符的第一个出现位置。基本步骤如下:
```cpp
#include <iostream>
#include <vector>
int bruteForceSearch(const std::string& str, char target) {
for (size_t i = 0; i < str.length(); ++i) {
if (str[i] == target) {
return static_cast<int>(i);
}
}
// 如果没有找到目标,返回 -1
return -1;
}
int main() {
std::string str = "Hello, World!";
char target = 'W';
int result = bruteForceSearch(str, target);
if (result != -1)
std::cout << "Target found at index: " << result << std::endl;
else
std::cout << "Target not found." << std::endl;
return 0;
}
```
(2) KMP算法(Knuth-Morris-Pratt算法)是一种更高效的字符串匹配算法,它通过预计算部分匹配表(PMT)来避免回溯。这里是一个简单的C++实现:
```cpp
#include <vector>
std::vector<int> computePMT(const std::string& pattern) {
std::vector<int> pmt(pattern.size());
int j = -1;
for (int i = 1; i < pattern.size(); ++i) {
while (j >= 0 && pattern[j + 1] != pattern[i]) {
j = pmt[j];
}
if (pattern[j + 1] == pattern[i]) {
j++;
}
pmt[i] = j;
}
return pmt;
}
bool kmpSearch(const std::string& text, const std::string& pattern) {
std::vector<int> pmt = computePMT(pattern);
size_t i = 0, j = 0;
while (i < text.size()) {
if (text[i] == pattern[j]) {
i++, j++;
} else if (j > 0) {
j = pmt[j - 1];
} else {
i++;
}
if (j == pattern.size()) {
return true;
}
}
return false;
}
int main() {
// 使用KMP算法...
}
```
BM算法(Boyer-Moore算法)也是一种著名的字符串搜索算法,它结合了坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule)。实现略复杂一些,这里不详述,但它通常比KMP更快。
(3) 时间复杂性分析:
- BF: O(nm),其中n是文本长度,m是模式长度。
- KMP: O(n + m),因为预处理部分匹配表的时间复杂度是O(m),实际匹配过程是线性的。
- BM: 最优情况下的时间复杂度也是O(n + m),但在最坏情况下可能会达到O(n*m)。
为了验证这些理论,你可以编写一组包含不同大小的输入的测试用例,并测量每个算法的实际运行时间。这需要编程环境的支持,比如记录开始和结束时间等。
阅读全文