Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:检查一个数组是否是另一个数组的子序列(编写一个更快的原始字符串搜索算法)_Javascript_Algorithm_Search - Fatal编程技术网

JavaScript:检查一个数组是否是另一个数组的子序列(编写一个更快的原始字符串搜索算法)

JavaScript:检查一个数组是否是另一个数组的子序列(编写一个更快的原始字符串搜索算法),javascript,algorithm,search,Javascript,Algorithm,Search,我想到了这个: [5, 4, 4, 6].indexOfArray([4, 6]) // 2 ['foo', 'bar', 'baz'].indexOfArray(['foo', 'baz']) // -1 后来我发现: 在正常情况下,我们只需查看每个错误位置的一个或两个字符,就可以看出它是一个错误的位置,因此在平均情况下,这需要+m步,其中n是草堆的长度,m是针的长度;但在最坏的情况下,在像aaaab这样的字符串中搜索像aaaab这样的字符串需要Onm步骤 有人能用JavaScript编写一

我想到了这个:

[5, 4, 4, 6].indexOfArray([4, 6]) // 2
['foo', 'bar', 'baz'].indexOfArray(['foo', 'baz']) // -1
后来我发现:

在正常情况下,我们只需查看每个错误位置的一个或两个字符,就可以看出它是一个错误的位置,因此在平均情况下,这需要+m步,其中n是草堆的长度,m是针的长度;但在最坏的情况下,在像aaaab这样的字符串中搜索像aaaab这样的字符串需要Onm步骤


有人能用JavaScript编写一个更快的indexOfArray方法吗?

您需要的算法是用于在字符串中查找子字符串起始索引的KMP算法-您可以对数组执行完全相同的操作


我找不到javascript实现,但这里有其他语言的实现-将其转换为js应该不难。

您需要的算法是用于查找字符串中子字符串起始索引的KMP算法-您可以对数组执行完全相同的操作


我找不到javascript实现,但这里有其他语言的实现——将其转换为js应该不难。

FWIW:我发现这篇文章读得很好,它讨论了Boyer Moore的几个变体,尽管它不在javascript中。Timo Raita的变体-参见链接的第一个链接将是我的建议,因为潜在的实际速度增益不会降低big-O,尽管big-O只是上限!。注意文章底部的结论和上面的基准


我主要是试图反对Knuth Morris Pratt的实施-

FWIW:我发现这篇文章读得很好,它讨论了Boyer Moore的几个变体,尽管它不是JavaScript。Timo Raita的变体-参见链接的第一个链接将是我的建议,因为潜在的实际速度增益不会降低big-O,尽管big-O只是上限!。注意文章底部的结论和上面的基准


我主要是试图反对Knuth Morris Pratt的实施-

对于初学者,您可以检查array.length>this.lengthreturn-1;是否正确;。其次,我看不到任何东西比js的原生indexOf快得多,并从该索引继续。-1有人能用JavaScript编写更快的indexOfArray方法吗?请不要伪代码?你不能读伪代码之类的东西吗?你可能想解决这个问题。标题上的子集是错误的,因为它也可能意味着元素的位置无关紧要。但是,如果标题包含propper子字符串,那么问题就不存在了。对于初学者,您可以检查array.length>this.lengthreturn-1;。其次,我看不到任何东西比js的原生indexOf快得多,并从该索引继续。-1有人能用JavaScript编写更快的indexOfArray方法吗?请不要伪代码?你不能读伪代码之类的东西吗?你可能想解决这个问题。标题上的子集是错误的,因为它也可能意味着元素的位置无关紧要。但是,如果标题中包含了propper子字符串,那么问题就不存在了。尽管这仍然是Onm[最坏情况],我相信。尽管这仍然是Onm[最坏情况],我相信。
Array.prototype.indexOfArray = function(array) {
    var m = array.length;
    var found;
    var index;
    var prevIndex = 0;
    while ((index = this.indexOf(array[0], prevIndex)) != -1) {
        found = true;
        for (var i = 1; i < m; i++) {
            if (this[index + i] != array[i]) {
                found = false;
            }
        }
        if (found) {
            return index;
        }
        prevIndex = index + 1
    }
    return index;
};