【问题标题】:Binary Search: Infinite Loop二进制搜索:无限循环
【发布时间】:2018-10-09 08:08:51
【问题描述】:

我正在尝试解决二分搜索问题,但是,我不断遇到无限循环,因为 lo himid 的值不会像他们想象的那样改变。我正在尝试搜索函数count_lines(mid,k) >= n 的最小中间值。我花了几个小时调试这段代码,但我仍然无法弄清楚lohimid 的值有什么问题。有人可以看看我的代码并告诉我为什么会这样吗?非常感谢!

失败的测试用例:n=9k=2 这是我的代码:

   def count_lines(v,k):
   ...
   ...
   return count_lines #count_lines is an integer` 


   def binarySearch_v(n, k):
   lo = 0
   hi = n
   mid = (lo + hi)//2
   while (lo <= hi):
     if (count_lines(mid, k) < n):
        lo = mid
     elif (count_lines(mid, k) > n):
        hi = mid
     elif (count_lines(mid, k) >= n and count_lines(mid-1, k) < n):
        return mid
     mid = (lo + hi) // 2

    def main():
      print(binarySearch_v(n,k)) # Failed at n=9 & k=2
    main()

【问题讨论】:

标签: python algorithm binary-search


【解决方案1】:

这是您的终止条件:

while (lo <= hi):

这里是lohi 可能改变值的地方:

lo = mid
...
hi = mid

合乎逻辑的结论是,如果这段代码循环的次数足够多,您最终会得到lo == hi。然后mid 将设置为两者的平均值,等于它们两者,这就是所有三个变量都将保留的地方。因此,循环不会终止。有两种可能的解决方案:要么更改重新分配lohi 的方式,要么将终止条件更改为&lt; 而不是&lt;=

【讨论】:

  • 感谢您的帮助!我明白你在说什么。我试图按照您的建议将终止条件从 mid 的值似乎很奇怪,即使我将 mid 的值重新分配为新的低点和新的高点。我附上了我的输出截图供您查看。非常感谢您的帮助!
  • 似乎您的代码总是采用这些 if 语句的 "GOT HERE" 分支。我建议通过弄清楚 为什么 它总是采用那个分支以及它应该做什么来进行调试。
  • 我会调查的。谢谢!
猜你喜欢
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多