根据我正在阅读的书,插值搜索在平均情况下需要O(loglogn)
本书假设每次比较都会将列表的长度从n
缩短为sqrt(n)
。嗯,考虑到这个假设,找出O(loglogn)
并不困难
然而,这本书没有更多地谈论这个假设,只是它说这是正确的。
问题:有人可以解释为什么这是真的吗?
答案 0 :(得分:5)
这取决于输入是否均匀分布(没有这样的假设,O(log n)是理论上最好的,即二分搜索是最优的)。在均匀分布的情况下,方差在sqrt(n)附近,并且在预期情况下,每次迭代都在目标的方差内。因此,正如您所说,搜索空间来自n - >每次迭代时sqrt(n)。
答案 1 :(得分:0)
想象一下一个排序数组,其中每个条目都是一个到一百万的数字。您想要查看数组中是否有10000。由于10000小于99%的数字少于一百万,如果数组具有良好的数字分布,则如果数组中的10000条目非常靠近开头,则可能是10000条目。如果我们通过数组查看条目的1%,并发现它大于10000,我们就可以在一个步骤中消除99%的数组。这比二进制搜索要好得多,二进制搜索只查看间隔的中间,因此一次只能消除最多一半的搜索空间。这就是为什么在某些情况下插值搜索比二分搜索快得多的原因。
要查看为什么预期为O(log log n)的严格分析,您必须阅读有关算法的教科书或论文。