【问题标题】:Python Binary Search Mid calculationPython Binary Search Mid 计算
【发布时间】:2022-01-04 22:42:04
【问题描述】:

为什么用“mid = (high + low) // 2”而不是“mid = high//2”? 我无法完全理解他们为什么使用 mid = (high + low)//2 如果有人能揭开我对此的理解,那将不胜感激:)

# Iterative Binary Search Function
# It returns index of x in given array arr if present,
# else returns -1
def binary_search(arr, x):
    low = 0
    high = len(arr) - 1
    mid = 0

    while low <= high:

        mid = (high + low) // 2

        # If x is greater, ignore left half
        if arr[mid] < x:
            low = mid + 1

        # If x is smaller, ignore right half
        elif arr[mid] > x:
            high = mid - 1

        # means x is present at mid
        else:
            return mid

    # If we reach here, then the element was not present
    return -1


# Test array
arr = [ 2, 3, 4, 10, 40 ]
x = 10

# Function call
result = binary_search(arr, x)

if result != -1:
    print("Element is present at index", str(result))
else:
    print("Element is not present in array")

【问题讨论】:

    标签: python binary-search


    【解决方案1】:

    因为当您的算法完成时,lowhigh 都在移动。 mid 不是数组的严格中间,它是您必须搜索的其余值的中间:lowhigh 之间的中间。因此我们计算平均值:(low+high) // 2 得到mid

    为了更好地可视化问题:

    【讨论】:

      【解决方案2】:

      (high + low) // 2 确保mid 索引在lowhigh 的范围内。如果您在mid 计算中不使用low,您最终可能会得到mid &lt; low 的结果,这会破坏二进制搜索,因为您停止在已将其缩小到的值范围内搜索.

      【讨论】:

        【解决方案3】:

        假设您要搜索[5, 4, 7, 8, 1, 2, 11, 12] 索引将是:[0, 1, 2, 3, 4, 5, 6, 7]

        对于二分查找,我们必须把它分成两半。

        中间元素:mid = (high + low )/ 2

        这里是high = 7low = 0,因此您可能会想,为什么我们甚至需要在零时使用low。

        但是当我们必须进一步划分数组的后半部分时,即[1, 2, 11, 12] 与索引[4, 5, 6, 7]

        mid = (high + low) / 2 high = 7, low = 4,因此是 mid = 6。在这里你不能做mid = high/2。你可以看到区别。它有助于为所有的一半找到正确的中间位置。

        【讨论】:

          【解决方案4】:
          a=[2, 3, 4, 10, 40]
          

          在这个数组上进行二进制搜索 10 仔细观察高、低、中的值你就会明白我们为什么要使用它

          high = 4
          low  = 0 
          mid = 2
          

          现在 mid 的值小于 10,我们将 mid 更改为 low

          low = 2
          high = 4
          mid = 3
          

          因此找到了号码

          正如你所见,为什么我们放低来计算中间值,如果我们不做这个中间值,那么对于这种情况,我们将无法遍历数组。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-05
            • 1970-01-01
            • 1970-01-01
            • 2022-11-13
            • 2018-06-04
            相关资源
            最近更新 更多