【问题标题】:Is there a more efficient search factor than midpoint for binary search?对于二分搜索,是否有比中点更有效的搜索因子?
【发布时间】:2018-02-03 18:45:08
【问题描述】:

朴素二分搜索是一种非常有效的算法:您在排序后的数组中取高点和低点的中点,并相应地调整高点或低点。然后你重新计算你的端点并迭代直到你找到你的目标值(或者你没有,当然。)

现在,很明显,如果您不使用中点,就会给系统带来一些风险。假设您将搜索目标从中点移开并创建了两条边——我称它们为大边和小边。 (无论是向高还是向低移动都没有关系,因为它是对称的。)风险在于,如果你错过了,你的搜索空间就会比它大:你必须搜索大的一面更大。但奖励是,如果您点击搜索,您的搜索空间就会变小。

在我看来,风险与奖励的空间数量是相同的,并且(没有模式,我假设没有模式)一个元素高于和低于中点的可能性是相等的。所以风险在于它介于新目标和中点之间。

现在因为空格的数量会影响搜索空间,并且搜索空间是按对数测量的,所以在我看来,如果我使用,假设我们的搜索空间为 1/4 和 3/4,我已经削减了对数小空间的一半,大空间只增加了大约 0.6 或 0.7。

考虑到这一切:有没有比只使用中点更有效的方法来执行二分搜索?

【问题讨论】:

  • 不,如果我们不知道其他信息,中点是二分搜索最有效的方法。较小的一侧和较大的一侧之间的比率越小,您的搜索效果就越差。如果您选择 1/4 和 3/4,为什么不把它发挥到极致呢?让我们选择接近 0 和接近 1。在每个搜索步骤之后,您将不断地被放置在接近 1 的一侧,每次搜索时将搜索大小削减几乎为 0。这效率不高。
  • 乔希,你能证明吗?
  • 当然。让我们收集 10 个元素。 [1、2、3、4、5、6、7、8、9、10]。现在,让我们使用极值,并将该部分分为 [1] 和 [2, 3, 4, 5, 6, 7, 8, 9, 10]。发现它在更大的部分,让我们返回并将[2]和[3,4,5,6,7,8,9,10]分开。正如你所看到的,你的搜索属于 O(n) 搜索。
  • 这并不能证明不存在这样更好的系数。这证明 .99999 是一个可怕的系数。你的逻辑不成立。
  • 您可以自己轻松测试。绘制二分搜索中点的不同搜索时间,您会很快发现随着中点从 0.5 变为 0,您的比例从对数变为线性。时间不长

标签: optimization binary-search


【解决方案1】:

让我们同意,搜索关键字同样可能位于数组中的某个位置——否则,我们需要根据我们对该位置的特殊知识来设计一种算法。所以我们只能选择每次在哪里拆分数组。如果我们选择一个数字 0

那么什么时候最小化呢?如果这是数学堆栈交换,我们将采用导数(使用乘积规则、链式规则和指数规则),将它们设置为零,然后求解。但这是stackoverflow,所以我们用图表代替:

您可以看到,距离 1/2 越远,您的情况就越差。为了更好地理解,我推荐信息论或微积分,它们对此有有趣和互补的观点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 2018-08-10
    • 2016-03-06
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多