Java 确定长度为N的数组是否在长度为M的数组中

Java 确定长度为N的数组是否在长度为M的数组中,java,algorithm,Java,Algorithm,可能重复: 假设M>N,并且有2个数组。长度M中的一个称为A,长度N中的一个称为B。有没有更快的方法来确定数组A中是否存在数组B 例如: A=[123456] B1=[2 3 4] 所以数组B1在一段时间内存在,而类似于[1 3 2]的东西不存在 这实质上是在Java中用字符数组实现类似isSubstring()的东西 我能想到的唯一方法是在O(n^2)中,将A中的每个元素与B中的初始元素进行比较,然后在B中迭代寻找匹配项 我想这个问题在面试中很常见,所以我的问题是问是否有更快的方法。你想要吗

可能重复:

假设M>N,并且有2个数组。长度M中的一个称为A,长度N中的一个称为B。有没有更快的方法来确定数组A中是否存在数组B

例如:

A=[123456]

B1=[2 3 4]

所以数组B1在一段时间内存在,而类似于[1 3 2]的东西不存在

这实质上是在Java中用字符数组实现类似isSubstring()的东西

我能想到的唯一方法是在O(n^2)中,将A中的每个元素与B中的初始元素进行比较,然后在B中迭代寻找匹配项

我想这个问题在面试中很常见,所以我的问题是问是否有更快的方法。

你想要吗

算法kmp_搜索: 输入: 字符数组,S(要搜索的文本) 一个字符数组,W(寻找的单词) 输出: 一个整数(在S中找到W的从零开始的位置)

复杂性:

假设表T先前存在,则 Knuth–Morris–Pratt算法的复杂性为O(k),其中k是 S和O的长度是大O表示法。除了固定的 进入和退出功能时产生的管理费用,所有 计算在while循环中执行,我们将计算 绑定在此循环的迭代次数上;为了做到这一点,我们 首先对T的性质做一个重点观察。通过定义它 如果在S[m]处开始的匹配在 比较S[m+i]和W[i],那么下一个可能的匹配必须在 S[m+(i-T[i])。特别是,下一个可能的匹配必须在 比m更高的指数,因此T[i] 其他信息:

KMP算法的效率

由于算法的两个部分分别, O(k)和O(n)的复杂性,即整个算法的复杂性 是O(n+k)。这些复杂性是相同的,不管有多少 重复模式为W或S


@旋转机器人。把它贴错地方了?
define variables:
    an integer, m ← 0 (the beginning of the current match in S)
    an integer, i ← 0 (the position of the current character in W)
    an array of integers, T (the table, computed elsewhere)

while m+i is less than the length of S, do:
    if W[i] = S[m + i],
        if i equals the (length of W)-1,
            return m
        let i ← i + 1
    otherwise,
        let m ← m + i - T[i],
        if T[i] is greater than -1,
            let i ← T[i]
        else
            let i ← 0

(if we reach here, we have searched all of S unsuccessfully)
return the length of S