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

时间:2015-10-31 15:54:42

标签: algorithm big-o time-complexity complexity-theory binary-search

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

例如:

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

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

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

  

现在输入数组可以包含不同大小的单词。所以,当我   我计算最终的复杂性,最终的答案是O(m * logn)   其中m是我们想要在数组中搜索的单词的大小,在我们的例子中   是"斑马"我们要搜索的词?

1 个答案:

答案 0 :(得分:1)

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

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

但是,鉴于数组已排序,我们可以进行很多改进。用户"doynax"建议,

  

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

因此,整个m字符比较必须完成,直到字符串结束,如果找到,或者甚至没有那么多(如果在早期阶段失败)。

因此,总体复杂性为O(m + log n)