IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Algorithm第四版算法 C++实现(二十八)——Rabin Karp算法(指纹字符串查找算法) -> 正文阅读

[C++知识库]Algorithm第四版算法 C++实现(二十八)——Rabin Karp算法(指纹字符串查找算法)

字符串没法直接进行比较,但是数字可以直接进行比较,那我们能不能把字符串转换为数字并比较是否相等呢?答案事肯定的。但是求出其散列表相同的字符串并不一定就相同(如果用的是几何加减法),比如ac和ab,ac和ca,都是相同的。用其他的处理方法也极有可能出现不同字符串相同散列值的情况,所以我们需要对符合匹配的字符串进行检查。

class rabinkarp
{
private:
	std::string pat;	//模式字符串
	long long pat_hash;		//模式字符串的散列值
	int m;		//模式字符串长度
	long long q = 2147483647;	//一个很大的素数
	int r = 256;	//字符表大小
	//long long rm;		//R^(m-1)%q ——书上如是说
	long long hash(std::string key, int m)		//求散列值
	{
		long long h = 0;
		for (int j = 0; j < m; j++)
		{
			h = ( h + key[j]) % q;
		}
		return h;
	}
	bool check(std::string txt,int i)	//检查字符串是否符合
	{
		for (int j = 0; j < m; j++)
		{
			if (txt[j + i] != pat[j])
			{
				return false;
			}
		}
		return true;
	}
public:
	rabinkarp(std::string pat)
	{
		this->pat = pat;
		this->m = pat.length();
		//rm = 1;
		/*
		for (int i = 1; i <= m - 1; i++)
		{
			rm = (r*rm) % q;
		}
		*/
		pat_hash = hash(pat, m);
	}
	int search(std::string txt)
	{
		int n = txt.length();
		long long txt_hash = hash(txt, m);
		//printf("%lld = %lld?\n", pat_hash , txt_hash);
		if (pat_hash == txt_hash)	//一开始就匹配成功
			return 0;
		for (int i = m; i < n; i++)
		{
			//txt_hash = (txt_hash + q - rm * txt[i - m] % q) % q;
			//txt_hash = (txt_hash*r + txt[i]) % q;
			txt_hash = (txt_hash + txt[i] - txt[i - m]);
			printf("loop:%d %lld = %lld?\n",i, pat_hash, txt_hash);
			if (pat_hash == txt_hash)
				if(check(txt,i-m+1))
					return i - m + 1;
		}
	}
};

运行结果

这是很巧妙的方法,对吧~?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 11:56:22  更:2021-08-26 11:58:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:56:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码