Search Pattern (Rabin-Karp Algorithm) in Java2025年5月10日 | 阅读 4 分钟 Rabin-Karp 算法是一种高效的字符串匹配方法,它使用哈希来在文本中查找模式。它不逐个检查字符,而是计算模式的哈希值,并将其与文本子字符串的哈希值进行比较。当发生哈希匹配时,算法会执行逐字符检查以验证匹配。 示例 1:在句子中查找单词 输入 文本 = "WELCOME TO JAVA PROGRAMMING" 模式 = "JAVA" 输出 模式在索引处找到:11 示例 2:搜索多次出现 输入 文本 = "ABABCABAB" 模式 = "ABAB" 输出 模式在索引处找到:0, 5 如何在 Rabin-Karp 中计算哈希值?步骤 1:选择基数和模数 选择一个素数 q 作为模数,以最小化哈希冲突并防止溢出。将 d 设置为基数,它表示可能的字符数(例如,ASCII 为 256)。 步骤 2:初始化哈希值 将模式和文本的第一个窗口的初始哈希值均设置为零。 步骤 3:计算模式和文本的初始哈希值 遍历模式和文本的第一个部分,使用以下公式计算它们的哈希值: 步骤 4:在文本中滑动模式 计算文本中第一个子字符串的哈希值,然后将模式一次一个字符地滑过文本。 步骤 5:更新每次滑动的哈希值 对于每次滑动,使用以下公式更新哈希值: 这可以有效地移除移出字符的贡献并添加新字符。 步骤 6:检查匹配 如果子字符串的哈希值与模式的哈希值匹配,则执行逐字符比较以确认匹配,因为不同的子字符串可能会产生相同的哈希值。 顶部表单 底部表单 算法步骤 1:使用滚动哈希函数计算指定模式和文本初始窗口的哈希值,同时预先计算哈希基数以实现更高效的滑动。 步骤 2:一次将窗口向前移动一个字符,遍历文本,并将当前窗口的哈希值与模式的哈希值进行比较。 步骤 3:当哈希值相同时,对模式和当前文本窗口进行逐字符比较,以验证是否存在合法匹配。 步骤 4:通过消除第一个字符,合并后续字符,并在必要时进行负值调整来计算下一个窗口的哈希值。 步骤 5:继续滑动窗口,查找匹配项,修改哈希值,并显示模式在文本中出现的所有位置。 让我们在 Java 程序中实现上述步骤。 文件名:RabinKarp.java 输出 Match found at index: 24 时间复杂度:由于哈希冲突,最坏情况复杂度为 O(N × M),而使用高效的滚动哈希计算,平均情况复杂度为 O(N + M)。 辅助空间复杂度:该算法仅需要几个整数变量来进行哈希计算,因此其辅助空间复杂度为 O(1)。 |
在本节中,我们将涵盖随时可能发生的 try-catch-finally 序列,这些序列会在出现异常时发生,以及控制流在提供的每种情况下的工作方式。在异常处理过程中,我们将遍历许多示例以……
阅读 6 分钟
IP 地址是连接到网络的所有设备的唯一数值标识符。IP 地址的第一个版本是一个 32 位地址,用句点 (.) 分隔。在 Java 中,Regex 或正则表达式是一个定义字符串模式的 API。它被广泛使用……
阅读 3 分钟
Java 基本数据类型 Java 中的基本数据类型是数据操作的基石。它们是 Java 语言中最基本的数据类型。Java 是一种静态类型编程语言,这意味着所有变量在使用前都必须声明。基本数据...
5 分钟阅读
在面向对象编程中,对象之间的通信是构建复杂系统的重要方面。实现这种通信的关键机制之一是消息传递。在 Java 中,消息传递允许对象通过调用方法和在它们之间传递数据来相互交互。在……
5 分钟阅读
java.nio.DoubleBuffer 有一个 limit() 函数。DoubleBuffer 类用于调整此 DoubleBuffer 的限制。此方法使用参数设置此缓冲区的新的限制,该参数是要设置的限制。这个新的限制没有被设置,并且...
阅读 3 分钟
要在 Java 中将所有特殊字符添加到字符串的末尾,必须遍历输入字符串,识别字母数字字符,然后重新排列它们,使特殊字符位于末尾。Java 的内置字符分类方法可用于……
5 分钟阅读
在 Java 中,“绑定”一词描述了 Java 编译器将对方法或函数在语句主体中的调用的关联方式。简单来说,绑定就是 Java 编译器在调用时查找适当方法的过程...
阅读 4 分钟
Shunting-yard 算法是计算机科学中一种常用的算法,用于将中缀表达式转换为后缀或前缀表达式。在后缀表示法(也称为逆波兰表示法,RPN)中,运算符放在操作数之后,而在前缀表示法(也称为波兰表示法….
阅读 8 分钟
Java 编程语言以其丰富的标准库而闻名,该库包含大量类和实用程序,有助于开发健壮高效的应用程序。在这些类中,System 类占有特殊的位置。它提供了访问系统...的访问权限。
阅读 3 分钟
在 Java 中,实例方法和静态方法是两种重要的函数类型。它们在方法的定义和调用方式上各有所不同。静态方法 静态方法,也称为类方法,属于类本身,而不是类的任何特定实例… …
7 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India