首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JavaScript:检查一个数组是否是另一个数组的子序列(编写一个更快的天真字符串搜索algo)

JavaScript:检查一个数组是否是另一个数组的子序列(编写一个更快的天真字符串搜索algo)
EN

Stack Overflow用户
提问于 2011-02-12 11:32:06
回答 2查看 2.7K关注 0票数 1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[5, 4, 4, 6].indexOfArray([4, 6]) // 2
['foo', 'bar', 'baz'].indexOfArray(['foo', 'baz']) // -1

我想出了这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
};

后来我找到了维基百科称它为Na ve字符串搜索。

在正常情况下,我们只需要看一个或两个字符,每个错误的位置,看它是一个错误的位置,所以在平均情况下,这需要O(n + m)步骤,其中n是干草堆的长度,m是针的长度;但在最坏的情况下,搜索像“aaaaaaaaab”的字符串像"aaaaaaaaab",它采取O(nm)步骤。

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

EN

回答 2

Stack Overflow用户

发布于 2011-02-12 11:37:59

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

我找不到javascript实现,但下面是其他语言匹配器的实现--将其转换为js应该不难。

票数 5
EN

Stack Overflow用户

发布于 2011-02-12 12:02:08

FWIW:我发现这篇文章很好地阅读了高效子串搜索,它讨论了Boyer的几个变体,尽管它不在JavaScript中。博耶-摩尔-霍斯波尔变体(由Timo‘s --参见链接的第一个链接)将是我对潜在的实际速度增益的“建议”(不减少大-O,但-大-大-O只是上限!)注意文章末尾的结论和上面的基准。

我主要是想反对Knuth-Morris-Pratt的实施;-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4980134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文