使用随机元素进行二进制搜索

时间:2015-02-16 08:13:00

标签: algorithm big-o time-complexity binary-search

我知道二进制搜索的时间复杂度为O(logn),可以搜索排序数组中的元素。但是,让我们说如果不选择中间元素,我们选择一个随机元素,它将如何影响时间复杂度。它仍然是O(logn)还是其他东西?

例如: 大小为18的数组中的传统二进制搜索将像18 - >一样下降。 9 - > 4 ...

我修改的二进制搜索ping一个随机元素,并决定根据值删除右边部分或左边部分。

2 个答案:

答案 0 :(得分:1)

我的尝试:

C(N)成为N元素中搜索所需的平均比较次数。为简单起见,我们假设算法仅在剩下单个元素时终止(在与键严格相等时没有提前终止)。

由于枢轴值是随机选择的,剩余尺寸的概率是均匀的,我们可以写出重现

C(N) = 1 + 1/N.Sum(1<=i<=N:C(i))

然后

N.C(N) - (N-1).C(N-1) = 1 + C(N)

C(N) - C(N-1) = 1 / (N-1)

这种复发的解决方案是Harmonic系列,因此行为确实是对数的。

C(N) ~ Ln(N-1) + Gamma

请注意,这是自然对数,它比基数2的对数好1.44倍!

我敢打赌,添加提前终止测试将进一步改善日志基础(并保持日志行为),但同时将比较次数增加一倍,因此在全局范围内,在比较方面会更糟。 / p>

答案 1 :(得分:0)

让我们假设我们有一棵大小为18的树。我正在寻找的数字是第一点。在最坏的情况下,我总是随机选择最高的数字,(18-> 17-> 16 ......)。有效地仅在每次迭代中消除一个元素。所以它变成了线性搜索:O(n)时间