算法和数据结构项目练习6-基于Karp‐Rabin 算法的字符串搜索

2023-11-05

Karp‐Rabin String Search

项目介绍

  1. 本项目实现了Karp‐Rabin字符串搜索算法。
  2. 程序读取的txt文件包含两个字符序列,分别在不同的测试行上。第一行是目标序列T,第二行是搜索序列S。读取这两个字符串并使用Karp‐Rabin算法找到序列S在序列T中出现的所有情况。
  3. 对于每个匹配的序列,打印T中第一个匹配字符的位置。
  4. 不使用STL或等价的库。
  5. 代码中使用简单的哈希函数做例子,可以自行改为复杂版的避免哈希值撞车。

读取文件介绍:

在这里插入图片描述
第一行是序列T,它是基于DNA碱基序列的无序序列,在测试文档中有1000+列。
第二行是搜索序列S,它是我们需要在序列T中搜索到的连续字符串。

代码实现

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

//define the number of chars in the input alphabet d(e.g. 256)
//define a suitable prime number q(e.g. 101)
#define d 256
#define q 101

int roll(int ht, int c1, int c2, int h);
int pow(int e);
int hash1(string str, int m);

int main()
{

	ifstream read;
	string a;
	cout << "Please enter the filename: " << endl;
	cin >>a;
	
	read.open(a.c_str());
	if (!read)
	{
		cout << "Can't open file" << endl;
		exit(1);
	}
	string T;
	string S;
	while (!read.eof())
	{
		read >> T;
		read >> S;
	}
	read.close();
	int n = T.length();
	int m = S.length();
	int h = pow(m - 1);
	int hash_s = hash1(S, m);
	int hash_t = hash1(T, m);
	for (int i = 0; i < n - m; i++)
	{
		if (hash_s == hash_t)
		{
/*
compare S and the substring of T to confirm
if match print(“String found at location: “ i)
*/
// check the characters to avoid the same hash value
			int c = 0;// count value 
			int pn = 0;//position number
			while( pn < m)
			{
			
					if (S[pn] == T[i + pn])
					{
						c++;
					}
			
			 if (c==m)
			{
			cout << "String found at location: " << i << endl;
					
			}
				pn++;
			}
	
		}

		//call next rolling hash key
		hash_t = roll(hash_t, T[i], T[i + m], h);
	}

	return 0;
}

// Rolling hash fn: Calculates hash value for next substring
int roll(int ht, int c1, int c2, int h)
{
	// Remove leading char and add trailing char to hash value
	ht = (d * (ht - c1 * h) + c2) % q;
	if (ht < 0)
	{
		ht = ht + q;
	}
	return ht;
}

// return d exp e mod q
int pow(int e)
{
	int p = 1;
	for (int i = 0; i < e; i++)
	{
		p = (p*d) % q;
	}
	return p;
}

// returns rolling hash hey of str
int hash1(string str, int m)
{
	int h = 0;
	for (int i = 0; i < m; i++)
	{
		h = ((d*h) + str[i]) % q;
	}
	return h;
}


输出结果如下:
在这里插入图片描述

从结果可以看到在字符串的652的位置找到了AGCTA,我们打开读取的txt文件,果然在第653列找到了相匹配的字符串。(第一位是0所以652+1=653)

同理第二个相匹配的位置发现在第732列。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法和数据结构项目练习6-基于Karp‐Rabin 算法的字符串搜索 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它

随机推荐

  • 自学Python能做哪些副业?我一般不告诉别人

    Python作为今天的互联网不可或缺的一门技能 可以成为自己的主业以外 其实它也还是可以成为副业的 那么学好python后可以从事的副业有哪些呢 自学Python能干的副业 1 兼职处理数据 分析数据是很重要的一点 那么利用python 就
  • 结构化思维的训练方式

    转自 https www sohu com a 198266900 628522 结构化思维 Structured Thinking 是指人在面对工作任务或者难题时 能从多个侧面进行思考 深刻分析导致问题出现的原因 系统制定行动方案 并采取
  • python实现剪刀石头布小游戏

    首先实现系统随机出剪刀石头布 import random 首先导入random模块 k 剪刀 石头 布 创建一个列表 列表共有我们所需要用到的三个元素 m random choice k 用该函数随机从k中取一个元素并赋值给m m便为剪刀石
  • MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

    最近学习MyBatis框架 用到多表查询比较多 以前学的不是很好 今特意回来补上 呜呜呜 有对MySql数据库的初步使用不是很了解的朋友们 可以切换到这里噢 https blog csdn net haobo article details
  • [CMake教程] if 和 else

    目录 一 基本语法 二 基本用法 三 其他用法 3 1 逻辑运算 3 2 存在性检查 3 3 文件操作 3 4 数值比较 3 5 字符串比较 3 6 版本比较 3 7 路径比较 CMake 3 24引入 一 基本语法 if
  • 华为od机考真题-最少面试官数

    while 1 try n int input nums for in range n nums append list map int input
  • MQTT 协议入门:基础知识和快速教程

    本文是 MQTT 协议的入门指南 提供了实用的代码示例 物联网和 MQTT 的初学者可以通过本文掌握 MQTT 的基本概念 快速开启 MQTT 服务和应用的开发 什么是 MQTT MQTT Message Queuing Telemetry
  • Dell服务器通过IDRAC9收集TSR日志排查故障

    登陆IDRAC9 WEB管理界面 在菜单栏 lt 维护 gt 下选择 在联网的情况下推荐完成SupportAssist的注册 根据提示安装ISM并进行信息登记 如暂不注册 则点击取消继续 进入SupportAssist界面 点击 lt 开始
  • vue3+antv x6自定义节点样式

    前篇 vue3 ts使用antv x6 自定义节点 先大致定下节点样式 需要展示标题 输入 输出连接桩 参考样子大概是 https x6 antv antgroup com examples showcase practices class
  • 使用Pdb调试Python

    简单介绍 Python自带 Pdb库 使用 Pdb调试 Python程序还是很方便的 但是远程调试 多线程 Pdb是搞不定的 本文参考的相关文章如下 指针和字符串和字符串常量 用gdb来获取非法内存中的内容 Linux gdb调试器用法全面
  • 二维带权邮局位置(选址)问题(分别求横坐标、纵坐标的带权中位数)C++实现

    带权邮局位置问题 已知n个点p1 p2 pn及与它们相联系的权重w1 w2 wn 我们希望能找到一点p 不一定是输入点中的一个 使和式 最小 此处d a b 表示点a和点b之间的距离 找出二维带权邮局位置问题的最佳解答 其中所有的点都是 x
  • V4L2下摄像头的详细参数调整

    Linux下V4L2相关头文件所在路径为 内核源码目录 include linux videodev2 h V4L2相关API文档可查看链接https linuxtv org downloads v4l dvb apis uapi v4l
  • R语言实战之如何绘制线性回归图表(附详细代码解释,小白也可看懂~)

    R语言实战之如何绘制线性回归图表 线性回归是统计学中最简单的模型之一 此章节主要讲述如何利用R语言来绘制线性图表 尽可能用最简单的语句写出所需的图表 适合帮助没有R语言编程基础的同学写出好看的论文 下面展示一个依剂量对比药物A和药物B的响应
  • Oracle中Hint深入理解(转)

    Hint概述 基于代价的优化器是很聪明的 在绝大多数情况下它会选择正确的优化器 减轻了DBA的负担 但有时它也聪明反被聪明误 选择了很差的执行计划 使某个语句的执行变得奇慢无比 此时就需要DBA进行人为的干预 告诉优化器使用我们指定的存取路
  • vue打包到生产环境

    1 进入到项目根目录执行 npm run build 此时会自动打包在dist目录下 2 安装服务 npm install g serve 3 启动 serve dist 以上是生产环境打包的过程 npm run dev 是开发环境 npm
  • JavaWebの知识讲解(JDBC+JSP+Servlet)

    JavaWeb 一 web开发的背景知识 web 顾名思义是网页的意思 如 www baidu com web分为静态web和动态web 1 静态web 纯前端网站即使静态web 只使用html css等前端语言进行编写 静态web提供给所
  • git:在gitignore中设置不忽略的文件(夹)

    说明 用的不算多 但是想用的时候总会忘记 这里插个眼 参考 https blog csdn net CalShell article details 52670175 总结 活用
  • 微信小程序如何调用API实现数据请求-wx.request()

    前言 微信小程序不存在ajax 那么它是如何实现数据请求功能的呢 微在信中提供了API的调用wx request OBJECT 这个是很不错的 下面就讲一下如何请求数据 简单到不行 wx request 看文档时 提供了示例模板如下 wx
  • tcpdump使用详解

    1 tcpdump的语法格式 tcpdump option proto dirction type option 可选参数 proto 协议过滤器 可识别的关键词有 http tcp udp icmp ip ip6 arp rarp typ
  • 算法和数据结构项目练习6-基于Karp‐Rabin 算法的字符串搜索

    Karp Rabin String Search 项目介绍 代码实现 项目介绍 本项目实现了Karp Rabin字符串搜索算法 程序读取的txt文件包含两个字符序列 分别在不同的测试行上 第一行是目标序列T 第二行是搜索序列S 读取这两个字