【问题标题】:In Binary search why doing mid = (left + (right - left)) // 2 is better than mid = (left + right) // 2? [duplicate]在二分搜索中,为什么 mid = (left + (right - left)) // 2 比 mid = (left + right) // 2 好? [复制]
【发布时间】:2021-10-27 04:51:33
【问题描述】:

在二分查找while循环中:

left, right = 0, len(nums)
while left < right:
    mid = (left + right) // 2
    if nums[mid] == target:
        return mid

为什么在 Python 以外的某些语言中使用 mid = (left + (right - left)) // 2 比使用 mid = (left + right) // 2 更好?

编辑:好像我的括号弄错了。感谢您指出这一点,它对我来说更清楚了。我会这样离开,以防其他人偶然发现。我在 youtube 视频中看到了这句话,但这个人从未解释过为什么一个会比另一个更好。谢谢大家的回答!

谢谢大家!

【问题讨论】:

  • 这是您从其他来源读到的内容吗?你应该链接到它
  • 这两个在我知道的任何语言中都不一样。
  • 如果有的话,你的意思是:mid = left + (right - left) // 2
  • 同意@user2390182 你的意思是mid = left + (right - left) // 2,这有助于避免溢出。
  • 这能回答你的问题吗? Midpoint Formula Overflow Error

标签: python binary-search


【解决方案1】:

在 Python 中,两者都不是更好。或者更确切地说,(left + right) // 2 稍微好一点,因为它少了一次算术运算。但这可以忽略不计。

在其他语言中,left + (right - left) // 2 将用于避免 integer overflow,这可能在执行 left + right 时发生。这在 Python 中不会发生,因为 Python 本身就允许任意大的整数。所以你看到的建议与 Python 无关。

【讨论】:

    【解决方案2】:

    如果left + right 的值对于它们的int 表示来说太高,那么left + right 可能会溢出。详情请见Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken

    这是 C 等语言中的一个问题,其中 int 变量有限制,但在 Python 中没有。使用更简单的代码应该没问题。

    【讨论】:

      【解决方案3】:

      好吧,你把括号弄错了。我会让你弄清楚的。

      但要回答你的问题:

      在 Python 中这无关紧要,因为整数可以根据需要增长。

      在其他语言中,整数大小有限制,left + right 可能会溢出,而替代计算不会。

      【讨论】:

        【解决方案4】:

        这样做是为了处理 C 和 C++ 等语言中数字和的溢出。您对整数范围有限制。在

                        int mid = (low+high)/2;
        

        我们先计算总和,然后再除,这可能会溢出缓冲区以获取较大的低值和高值。

        这种溢出情况的处理方法是先计算差值,然后将差值除以低值。结果,

                        int mid = low + (high-low)/2;
        

        【讨论】:

          猜你喜欢
          • 2019-06-09
          • 1970-01-01
          • 2017-11-24
          • 2014-04-30
          • 2022-01-04
          • 2019-02-08
          • 1970-01-01
          • 2012-10-03
          • 2016-04-05
          相关资源
          最近更新 更多