Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time complexity 疾驰搜索时间复杂性?_Time Complexity - Fatal编程技术网

Time complexity 疾驰搜索时间复杂性?

Time complexity 疾驰搜索时间复杂性?,time-complexity,Time Complexity,用于在排序列表中搜索元素。开始在索引0处获取元素,然后在索引1、2、4、8、16等处获取元素,直到超出目标,然后在刚刚找到的范围内再次搜索 这有多复杂?在我看来,这似乎是某种对数时间复杂性,但我不知道是什么。(请参阅下面的编辑) 让我们看看最坏的情况。搜索继续从0、1、2、4、8。。。。 假设对于某些k>=0,n是2^k。在最坏的情况下,我们可能会一直搜索到2^k,并意识到我们超过了目标。现在我们知道目标可以是2^(k-1)和2^ k。该范围内的元素数为2^(k-1)(请仔细想想)。到目前为止,

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

这有多复杂?在我看来,这似乎是某种对数时间复杂性,但我不知道是什么。

(请参阅下面的编辑)

让我们看看最坏的情况。搜索继续从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))算法。感谢您在评论中指出这一点。我很感激。

在我看来,这似乎要快一点,不是吗?因为您没有对每个迭代进行
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))。参考: