Gallop search用于搜索已排序列表中的元素。你开始在索引0,然后在索引1,2,4,8,1等处获取一个元素,直到你超过目标,然后再在你刚刚找到的范围内搜索。
这个时间的复杂性是多少?在我看来,它是某种对数时间复杂度,但我无法弄清楚是什么。
答案 0 :(得分:3)
(请参阅下面的编辑)
让我们看一下最坏的情况。搜索从0,1,2,4,8继续.... 假设对于某些k> = 0,n是2 ^ k。在最坏的情况下,我们可能最终搜索直到2 ^ k并且意识到我们超过了目标。现在我们知道目标可以是2 ^(k - 1)和2 ^ k。该范围内的元素数量为2 ^(k - 1)(想想一秒)。到目前为止我们检查过的元素数是O(k),即O(logn)。以下重复总结了它。
T(n) = T(n/2) + O(logn)
= T(n/4) + c1log(n/2) + c2logn ((all logs are base 2.))
.
.
.
.
= O((logn)^2)
因此,该算法的最坏情况复杂度是logn的二次方。它可能不是最严格的约束,但它是一个很好的上限。
编辑:我错了。我已经采用了字面意义上给出的驰骋搜索的定义而没有遵循链接。链接说,一旦我们超调,我们在前一个间隔进行二分搜索。超过目标需要log(n)时间,并且在排序间隔中执行二进制搜索需要log(n)时间。这使得它成为O(log(n))算法。感谢Sumudu Fernando在评论中指出它。我很感激。