Arian Soleimanzadeh
  • 首页
  • 博客
  • 播客
  • 视频
  • 联系
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
面板•快速联系

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

预约咨询

发送一条简短消息——我会尽快回复。

LinkedIn快速回复
首页/文章/什么是 Rabin–Karp 算法?使用 Rolling Hash 进行字符串匹配
Algorithms文章

什么是 Rabin–Karp 算法?使用 Rolling Hash 进行字符串匹配

Rabin–Karp 使用 Rolling Hash 快速比较文本窗口和 Pattern 的 Hash,仅在 Hash 相同时执行精确字符比较,是经典的字符串匹配算法。

2026年8月19日7 分钟阅读0 浏览
#Algorithms#Rabin-Karp#Rolling Hash#Hashing#String Algorithms#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

使用 Sliding Window 和 Rolling Hash 进行字符串匹配的 Rabin–Karp 算法示意图

Arian Soleimanzadeh

AI · 代码 · 产品

研究 + 工程
本页目录
Rolling HashHash CollisionPolynomial Rolling HashTypeScript 实现复杂度与 KMP 的区别多 Pattern 搜索实际应用Double Hashing常见错误技术面试总结

Rabin–Karp 是一种经典的字符串匹配算法,用于在 Text 中查找 Pattern。

与每个位置都逐字符比较不同,它先计算 Pattern 的 Hash,然后与 Text 中相同长度 Window 的 Hash 进行比较。

核心思想是:

先比较 Hash,只有 Hash 相同时才进行精确字符串比较。

Rolling Hash

如果当前 Window 是:

ABC

下一个 Window 是:

BCD

我们不需要重新计算整个 BCD 的 Hash。

可以从旧 Hash 中移除 A 的贡献,然后加入 D。

这种技术称为 Rolling Hash。

Hash Collision

不同字符串可能产生相同的 Hash。

因此算法必须执行:

Hash Match
↓
Exact Character Comparison
↓
Real Match or Collision

不能把 Hash 相等直接当作字符串相等。

Polynomial Rolling Hash

字符串可以用多项式形式表示:

A × base² + B × base + C

再使用 Prime Modulo 控制数值大小。

TypeScript 实现

function rabinKarp(
  text: string,
  pattern: string
): number {
  const n = text.length;
  const m = pattern.length;

  if (m === 0) return 0;
  if (m > n) return -1;

  const base = 256;
  const prime = 101;

  let patternHash = 0;
  let windowHash = 0;
  let highOrder = 1;

  for (let i = 0; i < m - 1; i++) {
    highOrder = (highOrder * base) % prime;
  }

  for (let i = 0; i < m; i++) {
    patternHash = (
      base * patternHash + pattern.charCodeAt(i)
    ) % prime;

    windowHash = (
      base * windowHash + text.charCodeAt(i)
    ) % prime;
  }

  for (let i = 0; i <= n - m; i++) {
    if (
      patternHash === windowHash &&
      text.slice(i, i + m) === pattern
    ) {
      return i;
    }

    if (i < n - m) {
      windowHash = (
        base * (
          windowHash -
          text.charCodeAt(i) * highOrder
        ) +
        text.charCodeAt(i + m)
      ) % prime;

      if (windowHash < 0) {
        windowHash += prime;
      }
    }
  }

  return -1;
}

复杂度

平均情况下:

O(n + m)

如果发生大量 Collision,最坏情况可能达到:

O(n × m)

标准单 Pattern 实现的额外空间约为:

O(1)

与 KMP 的区别

KMP 使用 Prefix、Suffix 和 LPS 数组,并保证 O(n + m)。

Rabin–Karp 使用 Hashing 和 Rolling Hash,平均性能很好,但最坏情况可能受 Collision 影响。

多 Pattern 搜索

如果有很多相同长度的 Pattern,可以把它们的 Hash 存入 Set。

然后只需要检查每个 Text Window 的 Hash 是否存在于 Set 中,再对 Candidate 进行精确验证。

实际应用

Rolling Hash 的思想可以应用于:

  • 字符串搜索
  • Duplicate Detection
  • Plagiarism Detection
  • Document Fingerprinting
  • DNA Sequence Search
  • Repeated Substring
  • Substring Queries

Double Hashing

使用两个不同的 Hash 和 Prime 可以显著降低 Collision 的概率。

只有两个 Hash 都匹配时才认为 Window 是 Candidate。

常见错误

  • 只比较 Hash,不做精确验证。
  • 每次重新计算整个 Window Hash。
  • 忘记 Modulo。
  • 使用较差的 Base 或 Prime。
  • 错误地移除旧字符的高位贡献。

技术面试

Rabin–Karp 同时考察:

  • Hashing
  • Sliding Window
  • Modular Arithmetic
  • String Matching
  • Collision Handling

理解 Rolling Hash 的更新过程比死记代码更重要。

总结

Rabin–Karp 的整体流程是:

Pattern → Hash

Text
↓
Sliding Window
↓
Rolling Hash
↓
Compare Hash
↓
Verify

最值得掌握的核心并不仅是 Pattern Search,而是 Rolling Hash:利用上一个 Window 的结果高效计算下一个 Window 的 Hash。

本页目录
Rolling HashHash CollisionPolynomial Rolling HashTypeScript 实现复杂度与 KMP 的区别多 Pattern 搜索实际应用Double Hashing常见错误技术面试总结

文章信息

发布时间、阅读时长和浏览数据。

发布

2026年8月19日

更新

2026年8月19日

阅读时长

7 分钟阅读

浏览

0

作者

Arian Soleimanzadeh

上一篇

什么是 KMP 算法?理解 Knuth–Morris–Pratt 字符串匹配

下一篇

什么是 Levenshtein Distance?用动态规划理解 Edit Distance

让我们构建清晰、快速而优雅的作品。

用于合作、咨询或产品工作的快速联系入口。

快速联系给我发邮件
Arian Soleimanzadeh

个人作品集,聚焦现代 Web 工程、UI 系统与实用型 AI 产品——干净的代码,清晰的设计。

快速链接

  • 关于
  • 博客
  • 项目
  • 联系

联系

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

可联系时间: 工作日

通常回复时间在 24小时内。

订阅通讯

获取文章、项目与新版本发布的更新。

© 2026 ariansoleimanzadeh.site — 保留所有权利。

LinkedIn