首页 文章

二进制搜索字符串的复杂性

提问于
浏览
-3

我有一个排序的字符串数组:例如:[“bar”,“foo”,“top”,“zebra”]我想搜索输入字是否存在于数组中 .

例如:

search (String[] str, String word) {
     // binary search implemented + string comaparison.
}

现在二进制搜索将考虑复杂度,即O(logn),其中n是数组的长度 . 所以这么好 .

但是,在某些时候我们需要进行字符串比较,这可以在线性时间内完成 .

现在输入数组可以包含不同大小的单词 . 因此,当我计算最终复杂度时,最终答案是O(m * logn),其中m是我们想要在数组中搜索的单词的大小,在我们的例子中,“zebra”是我们要搜索的单词?

1 回答

  • 1

    是的,您的想法以及您提出的解决方案都是正确的 . 在String搜索的整体复杂性中,您还需要考虑最长String的长度 .

    一个简单的字符串比较是 O(m) 操作,其中 m 是两个字符串中较大者的长度 .

    但是,鉴于数组已排序,我们可以进行很多改进 . 正如用户"doynax"所暗示的那样,

    通过跟踪字符串比较期间匹配的字符数来改进复杂性,并在搜索期间存储下限和上限的当前计数 . 由于数组已排序,我们知道下一个要测试的中间条目的前缀必须至少匹配两个深度中的最小值,因此我们可以跳过比较该前缀 . 实际上,我们总是在不匹配时立即取得进展或停止增量比较,从而永远不需要继续保持原状 .

    因此,如果发现字符串的结尾,则必须进行整体 m 次字符比较,否则甚至不会那么多(如果在早期阶段失败) .

    因此,整体复杂性将是 O(m + log n) .

相关问题