首页 文章

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

提问于
浏览
0

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

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

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

2 回答

  • 0

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

  • 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倍!

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

相关问题