【问题标题】:binary search for a solution in Python在 Python 中二进制搜索解决方案
【发布时间】:2021-03-22 05:00:56
【问题描述】:

我试图写一个二分查找程序来找到满足的最大x

x**2+(n-x-small)-(x-small)*(x-small-1)/2 <= maxSum

因为我不知道如何直接求解方程。只有 x 是未知数。 lst 包含一系列可能的整数值

下面的代码不知何故没有给出任何返回值,尽管它可以在每个条件下打印。我被以下代码困了几个小时,不知道出了什么问题。

def binarySearch(self, lst, n, small, maxSum):
        m=len(lst)
        if m==1: 
            x=lst[0]
            a=x**2+(n-x-small)-(x-small)*(x-small-1)/2
            if a<=maxSum:
                return x
            else:
                return x-1
        else:
            j=m//2
            x=lst[j]
            a=x**2+(n-x-small)-(x-small)*(x-small-1)/2
            if a==maxSum:
                return x
            elif a > maxSum:
                self.binarySearch(lst[:j], n, small, maxSum)
            elif a < maxSum:
                self.binarySearch(lst[j:], n, small, maxSum)

【问题讨论】:

  • 你怎么称呼这个?我不相信二分搜索是解决这个问题的合适工具——你确定每次比较的结果是可排序的吗?示例输入以及smallnlst 的可能值的假设列表将很有帮助。此外,如果您在列表中使用切片,则几乎没有二进制搜索的意义。一旦你对列表进行切片,你的复杂性就是线性的,此时你不妨编写一个线性算法并跳过假装你有一个对数解。

标签: python algorithm return-value binary-search


【解决方案1】:

递归的问题是你必须返回递归函数。

您没有在 elif 语句的末尾这样做,这就是它进行计算但在从递归返回的途中丢失答案的原因。 :)

只需在调用递归之前添加 2 个返回值,如下所示:

def binarySearch(self, lst, n, small, maxSum):
m = len(lst)
if m == 1:
    x = lst[0]
    a = x ** 2 + (n - x - small) - (x - small) * (x - small - 1) / 2
    if a <= maxSum:
        return x
    else:
        return x - 1
else:
    j = m // 2
    x = lst[j]
    a = x ** 2 + (n - x - small) - (x - small) * (x - small - 1) / 2
    if a == maxSum:
        return x
    elif a > maxSum:
        return binarySearch(lst[:j], n, small, maxSum)
    elif a < maxSum:
        return binarySearch(lst[(j + 1):], n, small, maxSum)

elif a > maxSum:

返回 binarySearch(lst[:j], n, small, maxSum)

elif a

返回 binarySearch(lst[(j + 1):], n, small, maxSum)

【讨论】:

  • 我明白了!那是我的错误。非常感谢!
  • 欢迎您。我看到你的堆栈溢出有点新,如果它帮助你解决了你的问题,你可以点赞我的答案吗?
  • 当然。由于我真的很新,我的拇指似乎没有显示,但希望它被记录下来。
猜你喜欢
  • 2021-02-04
  • 2018-11-12
  • 2019-01-25
  • 1970-01-01
  • 2014-12-12
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多