Rabin-Karp算法的C程序用于模式搜索

rabin-karp算法的c程序用于模式搜索

C 中的模式匹配– 我们必须查找一个字符串是否存在于另一个字符串中,例如,字符串“algorithm”存在于字符串“naive algorithm”中。如果是找到,然后显示它的位置(即它所在的位置)。我们倾向于创建一个接收 2 个字符数组的函数,如果匹配则返回位置否则返回-1。

Input: txt = "HERE IS A NICE CAP"   pattern = "NICE"Output: Pattern found at index 10Input: txt = "XYZXACAADXYZXYZX"   pattern = "XYZX"Output: Pattern found at index 0   Pattern found at index 9   Pattern found at index 12

Rabin-Karp 是另一种模式搜索算法。就是字符串匹配Rabin 和 Karp 提出的算法,用于更有效地查找模式方式。与朴素算法一样,它也通过移动窗口来检查模式它会一一查找哈希值,但无需检查所有情况下的所有字符。当哈希值匹配时,才继续检查每个字符。这样,每个文本子序列只有一次比较,使其成为一种更有效的模式搜索算法。

预处理时间 – O(m)

Rabin-Karp算法的时间复杂度为O(m+n),但对于最坏的情况,它是O(mn)

算法

rabinkarp_algo(text,pattern,prime)

输入

rabinkarp_algo(text,pattern,prime)

输入 strong>− 正文和模式。查找哈希位置的另一个素数

输出− 找到模式的位置

Start   pat_len := pattern Length   str_len := string Length   patHash := 0 and strHash := 0, h := 1   maxChar := total number of characters in character setfor index i of all character in the pattern, do   h := (h*maxChar) mod primefor all character index i of pattern, do   patHash := (maxChar*patHash + pattern[i]) mod prime   strHash := (maxChar*strHash + text[i]) mod primefor i := 0 to (str_len - pat_len), do   if patHash = strHash, then      for charIndex := 0 to pat_len -1, do         if text[i+charIndex] ≠ pattern[charIndex], then         breakif charIndex = pat_len, then   print the location i as pattern found at i position.if i < (str_len - pat_len), then   strHash := (maxChar*(strHash – text[i]*h)+text[i+patLen]) mod prime, then   if strHash < 0, then   strHash := strHash + primeEnd

示例

 实时演示

#include#includeint main (){   char txt[80], pat[80];   int q;   printf ("Enter the container string 

"); scanf ("%s", &txt); printf ("Enter the pattern to be searched

"); scanf ("%s", &pat); int d = 256; printf ("Enter a prime number

"); scanf ("%d", &q); int M = strlen (pat); int N = strlen (txt); int i, j; int p = 0; int t = 0; int h = 1; for (i = 0; i < M - 1; i++) h = (h * d) % q; for (i = 0; i < M; i++){ p = (d * p + pat[i]) % q; t = (d * t + txt[i]) % q; } for (i = 0; i <= N - M; i++){ if (p == t){ for (j = 0; j < M; j++){ if (txt[i + j] != pat[j]) break; } if (j == M) printf ("Pattern found at index %d

", i); } if (i < N - M){ t = (d * (t - txt[i] * h) + txt[i + M]) % q; if (t < 0) t = (t + q); } } return 0;}

输出

Enter the container stringtutorialspointisthebestprogrammingwebsiteEnter the pattern to be searchedpEnter a prime number3Pattern found at index 8Pattern found at index 21

以上就是Rabin-Karp算法的C程序用于模式搜索的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:25:53
下一篇 2025年12月17日 22:26:07

相关推荐

  • C++程序以给定值为参数,找到双曲正弦反函数的值

    双曲函数是使用双曲线而不是圆定义的,与普通三角函数相当。它从提供的弧度角返回双曲正弦函数中的比率参数。但要做相反的事,或者换句话说。如果我们想根据双曲正弦值计算角度,我们需要像双曲反正弦运算一样的反双曲三角运算。 本课程将演示如何使用 C++ 中的双曲反正弦 (asinh) 函数,使用双曲正弦值(以…

    2025年12月17日
    000
  • C程序使用结构体存储库存系统

    结构是不同数据类型变量的集合,以单一名称分组在一起。 结构的特征 C 语言中结构的特征编程语言如下 – 可以通过使用赋值将不同数据类型的所有结构元素的内容复制到其类型的另一个结构变量 为了处理复杂的数据类型,最好在另一个结构中创建结构,这称为嵌套结构。 可以将整个结构、结构的各个元素和结…

    2025年12月17日
    000
  • C程序打印“偶数”或“奇数”,不使用条件语句

    在本节中,我们将看到如何在不使用任何条件语句(如,>=,==)的情况下检查一个数是奇数还是偶数。 我们可以通过使用条件语句轻松地检查奇数还是偶数。我们可以将数字除以2,然后检查余数是否为0。如果为0,则是偶数。否则,我们可以将数字与1进行AND运算。如果答案为0,则是偶数,否则为奇数。 这里不…

    2025年12月17日
    000
  • C++程序来检查一个字符是否为字母或非字母

    在解决一些逻辑编程问题时,使用字符串或字符有时非常有用。字符串是字符的集合,字符是 1 字节数据类型,用于保存 ASCII 值中的符号。符号可以是英文字母、数字或特殊字符。在本文中,我们将学习如何使用 C++ 检查一个字符是否是英文字母或字母表中的字母。 检查 isalpha() 函数 要检查数字是…

    2025年12月17日
    000
  • C程序乘以两个浮点数?

    Float是“浮点数”的缩写。按照定义,它是编译器内置的基本数据类型,用于定义具有浮动小数点的数值。浮点类型变量是可以保存实数的变量,例如4320.0、-3.33或0.01226。浮点数名称中的浮点部分指的是小数点可以“浮动”,即可以支持小数点前后可变数量的数字。 浮点数 类别 类型 最小大小 典型…

    2025年12月17日
    000
  • 寻找给定列表的中位数的C程序

    如果列表中的元素按顺序排列,则将列表中的元素分成两部分且两边元素数量相等的中间值称为中位数。 元素个数为奇数只有一个中间值;而;偶数个项目有两个中间值。 因此,偶数个项目的中位数被指定为两个中间值的平均值。 算法 请参考下面给出的算法来计算中位数。 步骤 1 – 将项目读入数组,同时保留…

    2025年12月17日
    000
  • 将以下内容翻译为中文:使用递归在C程序中将二进制转换为格雷码

    二进制数是只有两位 0 和 1 的数字。 格雷码是一种特殊类型的二进制数,其属性是代码的两个连续数字 em> 的差异不能超过一位。格雷码的这一特性使其在 K-map、纠错、通信等方面更加有用。 这使得二进制到格雷码的转换成为必要。那么,让我们看一下将二进制转换为格雷码的算法使用递归。 示例 让…

    2025年12月17日
    000
  • C程序中前n个偶数的平方和

    前n个偶数的平方和意味着,我们首先找到平方并将它们全部相加得到总和。 有两种方法可以找到前n个偶数的平方和 使用循环 我们可以使用循环从1到n迭代,每次增加1,找到平方并将其加到总和变量中− 例子 #include using namespace std;int main() { int sum =…

    2025年12月17日
    000
  • 活动选择问题的C程序

    活动选择问题是给定一组活动及其开始和结束时间的问题。我们需要找到一个人一次执行单个活动可以执行的所有活动。 此问题指定贪婪算法来选择下一个要执行的活动。我们先来了解一下贪心算法。 贪心算法是一种试图通过一步步寻找解来寻找问题解决方案的算法。为了选择下一步,该算法还选择了似乎最有希望的步骤,即与休息相…

    2025年12月17日
    000
  • 在C程序中,编译时错误和运行时错误之间的区别是什么?

    错误或异常是指由于代码执行中断而无法达到预期结果的情况。根据生成或识别错误的事件,我们可以将其分类为编译时错误和运行时错误。 以下是编译时错误和运行时错误之间的重要区别。 序号 关键 编译时错误 运行时错误 1参考编译时错误通常指与语法或语义相关的错误。另一方面,运行时错误指的是在运行时执行代码时遇…

    2025年12月17日
    000
  • 查找字符串长度的C程序

    这个字符串实际上是一个由字符组成的一维数组,以一个null 字符’’结尾。因此,一个以null结尾的字符串包含组成字符串的字符,后面跟着一个null。 要找到字符串的长度,我们需要循环并计算循环中的所有字符,直到匹配到‘’字符为止。 例如 输入 −naman  输出 − 字符…

    2025年12月17日
    000
  • C程序:求解停靠站问题

    问题陈述– 一个程序,用于查找火车在 n 个车站中的 r 个车站停靠的方式,以便没有两个停靠站是连续的。 问题解释 该程序将计算火车停靠的方式数,即排列。在这里,火车将从点X行驶到Y。在这些点之间,有n个站点。列车将在这n个车站中的r个车站停靠,条件是在r车站停靠时,列车不应在连续两个车…

    2025年12月17日
    000
  • C程序用于计算等比数列的第N项

    Given ‘a’ the First term, ‘r’ the common ratio and ‘n’ for the number of terms in a series. The task is to find the nth term of the series. So, before…

    2025年12月17日
    000
  • 使用C++程序将字符串中的所有辅音替换为最近的元音

    该方法旨在用字母表中最接近的元音(也称为小写拉丁字母)替换一串辅音。如果两个元音同样接近,我们可以用这些字母中的第一个元音来替换它们。 让我们来看一些输入场景 – 假设我们有一个字符串,比如“ebgkjasjd”,现在我们需要将字符串中所有出现的辅音字母替换为最近的元音字母。 Input…

    2025年12月17日
    000
  • C++程序打印字典

    映射是 C++ 中的一种特殊类型的容器,其中每个元素都是一对两个值,即键值和映射值。键值用于索引每个项目,映射值是与键关联的值。无论映射值是否唯一,键始终是唯一的。要在 C++ 中打印映射元素,我们必须使用迭代器。一组项目中的一个元素由迭代器对象指示。迭代器主要与数组和其他类型的容器(例如向量)一起…

    2025年12月17日
    000
  • C程序打印字符,不使用格式说明符

    在本文中,我们将了解如何在不使用任何格式的情况下打印一些字符说明符。 C 中的格式说明符有 %d、%f、%c 等。这些用于打印字符和C 中的数字使用 printf() 函数。 这里我们将看到另一种不使用 %c 格式说明符打印字符的方法。这个可以通过直接以十六进制形式放置ASCII值来完成。 示例代码…

    2025年12月17日
    000
  • C程序表示乘法表

    问题 编写一个程序,按照以下给定的格式打印从1 x 1到12 x 10的乘法表: 1 2 3 4 5 6 7 8 9 102 4 6 8 ……………….203 6 9………&…

    2025年12月17日
    000
  • 在C程序中,将数组范围查询与频率相同的元素进行翻译

    这里我们会看到一个有趣的问题。我们有一个包含 N 个元素的数组。我们必须执行一个查询 Q,如下所示: Q(start, end) 表示从开始到结束,数字“p”出现的次数恰好是“p”次。 p> 因此,如果数组类似于:{1, 5, 2, 3, 1, 3, 5, 7, 3, 9, 8},并且查询为 …

    2025年12月17日
    000
  • C++程序查找法向量和迹

    二维数组或矩阵在多个应用中非常有用。矩阵有行和列,并在其中存储数字。在C++中,我们也可以使用多维数组来定义二维矩阵。在本文中,我们将看到如何使用C++计算给定矩阵的范数和迹。 法线是矩阵中所有元素总和的平方根。迹是主对角线中存在的元素的总和。让我们看看算法和 C++ 代码表示。 矩阵法线 $beg…

    2025年12月17日
    000
  • C程序中的阶乘程序

    Given with the number n the task is to calculate the factorial of a number. Factorial of a number is calculated by multiplying the number with its sma…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信