Algorithm第四版算法 C++实现(二十七)——Boyer Moore算法(子字符串查找)

Boyer Moore算法其实也是从上期的算法中得到了其实,但是这个算法的进步可要比之前的算法大的多。他会将需要查找的子字符串解析处理,将某个字符出现的最右侧的位置记录下来,然后如果我们匹配失败,就可以根据这个信息回退了。显然,如果我们已经匹配的字符串中如果没有重复的内容,那么从子字符串到匹配失败的位置都不会由符合子串的内容。我们的right数组只是考虑了有重复的情况而已。如果有和失败处的字符相同的,那我们就把他移动到与哪个字符相同的位置继续匹配就好了。

class boyermoore
{
private:
	int r = 256;
	std::string pat;
	int right[256];
public:
	boyermoore(std::string pat)
	{
		this->pat = pat;
		int m = pat.length();
		std::fill(right, right + r, -1);	//不包含在模式字符串中的值设为-1
		for (int i = 0; i < m; i++)
		{
			right[pat[i]] = i;		//将包含在模式中的值设为他出现的最右边的位置
		}
	}
	int search(std::string txt)
	{
		int n = txt.length();
		int m = pat.length();
		int skip;
		for (int i = 0; i < n - m; i += skip)
		{
			skip = 0;
			for (int j = m - 1; j >= 0; j--)	//j代表已经匹配的字符的个数
			{
				if (pat[j] != txt[i + j])
				{
					skip = j - right[txt[i + j]];
					if (skip < 1)
					{
						skip = 1;
					}
					break;
				}
			}
			if (skip == 0)		//找到匹配
				return i;
		}
		return n;	//未找到匹配
	}
};
运行结果

在这里插入图片描述
看吧,这个算法比KMP算法,不仅好理解的多,更有更快的运行速度,并且占用更少的内存!这也侧面认证了算法的重要性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++实现顺序查找算法和二分法查找算法的示例代码: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; // 顺序查找算法 int seqSearch(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); i++) { if (nums[i] == target) { return i; } } return -1; // 查找失败 } // 二分法查找算法 int binarySearch(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 查找失败 } int main() { vector<int> nums = {3, 5, 2, 8, 4, 7, 1, 6}; sort(nums.begin(), nums.end()); // 二分法查找算法需要有序表 int target = 4; int index1 = seqSearch(nums, target); // 调用顺序查找算法 int index2 = binarySearch(nums, target); // 调用二分法查找算法 if (index1 != -1) { cout << "顺序查找成功,目标元素下标为:" << index1 << endl; } else { cout << "顺序查找失败,未找到目标元素" << endl; } if (index2 != -1) { cout << "二分法查找成功,目标元素下标为:" << index2 << endl; } else { cout << "二分法查找失败,未找到目标元素" << endl; } return 0; } ``` 以上代码中,我们使用了STL中的vector容器来存储顺序表元素,并使用sort函数对其进行排序,以便二分法查找算法能够正确执行。在main函数中,我们分别调用了顺序查找算法和二分法查找算法查找目标元素的值为4。最后,根据返回的下标值,输出查找结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值