我知道二进制搜索的时间复杂度为O(logn)
,可以搜索排序数组中的元素。但是,让我们说如果不选择中间元素,我们选择一个随机元素,它将如何影响时间复杂度。它仍然是O(logn)
还是其他东西?
例如: 大小为18的数组中的传统二进制搜索将像18 - >一样下降。 9 - > 4 ...
我修改的二进制搜索ping一个随机元素,并决定根据值删除右边部分或左边部分。
答案 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)时间