Rabin-Karp 中的滚动哈希

2023-12-12

我正在尝试实现 Rabin-Karp 来查找子字符串;我陷入了滚动哈希(试图使用维基百科中建议的公式).

#define MOD 1000000007
unsigned long long rolling_hash(const char *str)
{
        unsigned long long hash = 0;
        size_t str_len = strlen(str);
        for(int i = 0, k = str_len -1; i < str_len; i++, k--) {
                hash = hash + str[i] * pow(257, k);
        //      hash = hash % MOD;
        }
        return hash;
}

int main(void)
{
        printf("%llu\n", rolling_hash("TestString"));
        printf("%llu\n", rolling_hash("estStringh"));
        unsigned long long old = rolling_hash("TestString");
        // Add a character to the end
        // since the last char in old was multiplied by 1, now multiply it by
        // the base and then add the _new_ character to the end
        old = old * 257 + 'h';
        //old = old % MOD;
        // Remove a char from the start
        // Simply, remove the hash value of the first character
        old = old - 'T' * pow(257, 10);;

        printf("\n%llu\n", old);
        return 0;
}

只要我不引入任何余数运算,上面的代码就可以完美运行;一旦我取消注释我的%操作,事情崩溃了,我从滚动哈希的变化中得到的答案将不等于第二次打印所打印的答案。

贾尼兹的回答:
正如 Janisz 的答案中那样,更改哈希生成器的建议使其余部分在添加新字符时起作用,但在删除旧字符时不起作用。
Note:我用的是我自己的pow配合使用的函数unsigned long long


哈希生成器代码错误。它应该是

hash = (hash*257 + str[i]) % MOD;

并取消注释old_hash = old_hash % MOD;。还改变从以前生成新哈希的方式

(old_hash - to_delete_char * pow(257, str_len-1)) % MOD;

看看你的代码。前两行非常好。循环中发生了什么。 首先,你要尽可能多地进行乘法运算。在我的方法中我使用霍纳方案计算哈希值,因为哈希值是多项式。

为什么它在没有模数和没有模数时都有效。我认为这是一个巧合,因为您溢出了 8 个字符的整数 (log(2^64)/log(257) = 8)。

现在删除字符有什么问题。to_delete_char * pow(257, str_len);应该to_delete_char * pow(257, str_len-1);索引应该从 0 而不是 1 开始以匹配您的生成器。

EDIT:我认为问题出在 pow 函数上。正如我上面所写,它只溢出了 8 个字符。在您的示例中,您有 10 个,因此它无法工作。

EDIT:事实证明,添加和删除字符必须作为一项操作完成。可能是由于等价物但我不确定。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MOD 787

unsigned long long pow(int x, int y)
{
    unsigned long long ret = 1;
    for (int i=0;i<y;i++)
        ret = (ret*x)%MOD;
    return ret;
}
unsigned long long rolling_hash(const char *str)
{
        unsigned long long hash = 0;
        size_t str_len = strlen(str);
        for(int i = 0, k = str_len -1; i < str_len; i++, k--) {
                hash = hash + (str[i] * pow(257, k))%MOD;
                hash = hash % MOD;
        }
        return hash;
}

int main(void)
{
        char input[] = "TestString";
        printf("Input: %llu\n", rolling_hash(input));
        printf("Expected: %llu\n", rolling_hash("estStringh"));
        unsigned long long old = rolling_hash(input);
        // Add a character to the end
        // and Remove a char from the start

        unsigned long long  h = (input[0] * pow(257, strlen(input)))%MOD;
        old = ((old * 257) + 'h' - h) % MOD;

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

Rabin-Karp 中的滚动哈希 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户

随机推荐

  • 增加Asp.Net core中上传文件的大小

    目前 我正在使用 Asp Net Core 和 MVC6 需要上传文件大小不受限制 我已经搜索了它的解决方案 但仍然没有得到实际的答案 我已经尝试过这个链接 如果有人有任何想法请帮忙 Thanks 其他答案解决了IIS限制 然而 截至ASP
  • 使用 dompdf 在 pdf 上显示 INR 货币符号

    我正在使用 dompdf 创建 pdf 当我经过时 8377 pdf 将其转换为 如何使用 dompdf 在 pdf 中显示印度货币符号 dompdf 中的核心 PDF 字体 Helvetica Times Roman Courier 仅支
  • 错误:缺少类属性转换

    Error Missing class properties transform Test js export class Test extends Component constructor props super props stati
  • Android:触摸外部时如何关闭 DatePicker DialogFragment?

    我有一个扩展 DialogFragment 的工作 DatePickerFragment 我在 onCreateDialog 中设置了一个 DatePickerDialog 然后尝试添加 picker setCanceledOnTouchO
  • 从 Windows 禁用打印屏幕键盘选项

    有什么办法可以禁用打印屏幕键盘上的按钮 当然不会破坏它的键 我使用的是Windows 7 我需要它是因为提高了少数员工使用的数据库的安全性 如果您操作扫描码映射注册表项 则可以禁用任何键 可以找到一个包含设置说明的小教程here 扫描码图更
  • Crystal Reports 中的条件组 SUM

    我一直在做一些会计报告 并使用公式总结我的不同货币 IE 加拿大委员会公式 if myData 1 CurrencyType CDN then myData 1 Commission else 0 加拿大佣金总额 SUM CanadianC
  • 如何更改分屏 emacs 窗口的大小?

    我将 emacs 水平分割 在顶部我正在编辑 Perl 代码 底部是 shell 默认情况下 emacs 使两个窗口大小相等 但我希望 shell 缓冲区更小 也许是一半大小 我想知道我怎样才能做到这一点 使用鼠标 您可以拖动窗口大小 单击
  • 在java中将word文件另存为html

    我尝试使用java将word文件另存为html 我将 Word 文件另存为 xml 它对我有用 Runtime rt1 Runtime getRuntime rt1 exec C Program Files Microsoft Office
  • EditText 的子类看起来与 Android 4 上的普通 EditText 不同

    这是我在开发真实应用程序时发现的一个 错误 但我创建了一个空白项目来重现它 我有以下布局
  • 从不同用户会话列表中选择最早的日期和时间

    我有一个用户访问会话表 记录网站访问者活动 accessid userid date time url 我正在尝试检索用户 ID 1234 的所有不同会话 以及每个不同会话的最早日期和时间 SELECT DISTINCT accessid
  • CS7036 C# 没有给出与 c# 所需的形式参数相对应的参数

    我创建了 bool dropIndexes 来 void ladujZBazy 并创建了 if dropIndexes 因为当我检查 checkListBox1 中列表中的项目并使用 textBox1 搜索某些项目时 我之前的检查消失了 我
  • 修饰符 static 只允许在常量变量声明中使用

    我有一个内部类 用于存储我用于游戏的控件的信息 现在我想在其中存储一个静态 ArrayList 其中包含所有控件的名称 但我收到此错误 修饰符 static 只允许在常量变量声明中 private class Control public
  • 获取鼠标指针下的单词

    根据这个 使用 JavaScript 获取光标下的单词 链接我可以在鼠标指针下获取单词 这对于英语来说很好 我改变它 阿拉伯语 p p Word span span
  • Android 上的 ZXing 入门

    我正在尝试将 ZXing 添加到我的项目中 添加一个按下时调用扫描仪的按钮 我找到了这个 http groups google com group android developers browse thread thread 788eb5
  • 如何重命名 Oracle XMLTYPE 节点

    我在 PL SQL 中有一个 XMLType 我需要重命名一些节点和一些值 例如
  • 无法安装 Flask-Mail

    当用户在我的网站上注册时 我尝试使用 Flask 发送电子邮件 我使用了命令pip install Flask Mail安装 但是 我收到以下可能版本不匹配的错误 Downloading unpacking Flask mail Downl
  • Angular2 的 Http.post 在 POST 方法调用的响应中不返回标头

    我正在调用 REST 端点 我想添加资源 如下 但是 当我的服务调用 Http 的 post 方法时 它将调用请求 但不会返回响应的标头 至少 我遇到了 Response 实例的空 headers 对象 我确实期望响应标头 特别是 我希望
  • 如何从 VBA 函数返回结果

    如何从函数返回结果 例如 Public Function test As Integer return 1 End Function 这会产生编译错误 如何让这个函数返回一个整数 对于非对象返回类型 您必须将值分配给函数的名称 如下所示 P
  • 从数据框中按类别选择随机行?

    我有一个数据框如下 Category Name Value 我如何选择每个类别 5 个随机名称 使用sample使用所有行作为可能的候选行返回随机行 但是 我想指定每个类别的随机行数 有什么建议么 Update 我愿意使用ddply 在没有
  • Rabin-Karp 中的滚动哈希

    我正在尝试实现 Rabin Karp 来查找子字符串 我陷入了滚动哈希 试图使用维基百科中建议的公式 define MOD 1000000007 unsigned long long rolling hash const char str