【问题标题】:Gallop Search Time Complexity?Gallop 搜索时间复杂度?
【发布时间】:2011-03-10 19:02:48
【问题描述】:

Gallop search 用于在排序列表中搜索元素。您开始在索引 0 处获取元素,然后在索引 1、2、4、8、16 等处获取元素,直到超出目标,然后在刚刚找到的范围内再次搜索。

这个的时间复杂度是多少?在我看来,这是某种对数时间复杂度,但我不知道是什么。

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    (请参阅下面的编辑)

    让我们看看最坏情况下的行为。搜索从 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 在 cmets 中指出这一点。我很感激。

    【讨论】:

    • 在我看来要快一点,不是吗?因为您为每次迭代进行log(n)比较;随着时间的推移,你做的越来越少……不过我不确定那是什么……
    • 是的。你说的对!第一次迭代需要 log(n),第二次迭代需要 log(n/2) ......求和它给出了更严格的界限。同意!我给出了上限...我不确定是否严格求和会渐近地改变复杂性。
    • 哦...嗯...这意味着我们有log(n) + log(n) - log(2) + log(n) - log(3) ...,是的,您的绑定非常好;谢谢!
    • 该链接说它在初始“疾驰”之后切换到二进制搜索。总体复杂度仅为 O(log(n))(它甚至在链接中这么说!)
    • 时间复杂度不是与 N 无关(甚至可能是无限的)吗?对于找到正确区间的第一阶段,它是 O(log(k)),k = 搜索键索引。第二阶段也一样。总时间复杂度为 2*O(log(k)。由于我们通常忽略时间复杂度中的常数,所以总时间复杂度为 O(log(k))。参考:en.wikipedia.org/wiki/Exponential_search
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多