我有一个排序的字符串数组:例如:[" bar"," foo"," top"," zebra"]我想搜索数组中是否存在输入字。
例如:
search (String[] str, String word) {
// binary search implemented + string comaparison.
}
现在二进制搜索将考虑复杂度,即O(logn),其中n是数组的长度。所以很好。
但是,在某些时候我们需要进行字符串比较,这可以在线性时间内完成。
现在输入数组可以包含不同大小的单词。所以,当我 我计算最终的复杂性,最终的答案是O(m * logn) 其中
m
是我们想要在数组中搜索的单词的大小,在我们的例子中 是"斑马"我们要搜索的词?
答案 0 :(得分:1)
是的,您的想法以及您提出的解决方案都是正确的。在String搜索的整体复杂性中,您还需要考虑最长String的长度。
一个简单的字符串比较是一个O(m)
操作,其中m
是两个字符串中较大字符串的长度。
但是,鉴于数组已排序,我们可以进行很多改进。用户"doynax"建议,
通过跟踪期间匹配的字符数,可以提高复杂性 字符串比较,并存储较低和的当前计数 搜索过程中的上限。由于数组已排序,我们知道 接下来要测试的中间条目的前缀必须匹配到 至少是两个深度中的最小值,因此我们可以跳过 比较那个前缀。实际上,我们总是要么取得进步 或者在不匹配时立即停止增量比较,并且 从而永远不需要继续过去。
因此,整个m
字符比较必须完成,直到字符串结束,如果找到,或者甚至没有那么多(如果在早期阶段失败)。
因此,总体复杂性为O(m + log n)
。