【问题标题】:Why do some codes in Binary Search set the middle pivot as 'left + (right - left) //2'?为什么二进制搜索中的某些代码将中间枢轴设置为'left +(right - left)//2'?
【发布时间】:2022-01-04 04:05:35
【问题描述】:

例如 Python 中的基本二分搜索:

left, right = 0, len(nums) - 1

while left <= right:
    # // 2 -> floor
    pivot = left + (right - left) // 2
    if nums[pivot] == target:
        return pivot
    if target < nums[pivot]:
        right = pivot - 1
    else:
        left = pivot + 1

在这段代码中,pivot 是left + (right - left) // 2,而不是len(nums) // 2。 你能解释一下为什么吗?

【问题讨论】:

  • 如果使用len(nums) // 2,算法是否仍然有效?
  • len(nums) 是一个常量,当left 和/或right 改变时它永远不会改变。
  • 我要问的是,我不知道为什么在决定支点时使用left + (right - left) //2 的方法。与len(nums) // 2 相比,选择枢轴有什么优势吗?
  • 假设len(nums)100left=60, right=70。在这种情况下,len(nums) // 2 位于范围之外,而left + (right-left) // 265;正如预期的那样,就在中间。

标签: python algorithm binary-search


【解决方案1】:

len(sums)//2 永远不能与left + (right - left) // 2 互换。它们是不同的东西。但是有(left + right) // 2 可能是你感到困惑的地方。

left + (right - left) // 2(left + right) // 2基本上是一样的,除了一点:后者会溢出,因为我们先将leftright相加,然后相除。整数溢出在 Python 中是不可能的,但在整数大小有限的 C 和 Java 等语言中可能会发生这种情况。

Read this article 关于这个错误是如何在许多代码库中普遍存在的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2019-06-09
    • 2019-01-17
    • 2019-08-18
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多