【问题标题】:Error in Python Binary Search Algorithm when using pseudocode使用伪代码时 Python 二进制搜索算法出错
【发布时间】:2015-11-13 20:52:40
【问题描述】:

所以我正在尝试制作递归二进制搜索算法,这是我正在使用的伪代码:

BINARY-SEARCH(X, A, start, end)
1  if start > end then
2     return False
3  middle = ((end - start) / 2) + start
4  if X = A[middle] then
5     return True
6  else if X < A[middle] then
7     return BINARY-SEARCH(X, A, start, middle - 1)
8  else
9     return BINARY-SEARCH(X, A, middle + 1, end)

这是我的程序:

def binarySearchRec(value, list, start, end):
    if start > end:
        return False
    middle = ((end - start) / 2) + start
    if value == list[middle]:
        return True
    elif value < list[middle]:
        return binarySearchRec(value, list, start, middle - 1)
    else:
        return binarySearchRec(value, list, middle + 1, end)

所以每当我使用不在列表中的值时,我都会不断收到索引错误,但它可以很好地查找列表中的值,非常感谢任何帮助

【问题讨论】:

  • 提示:python 列表是零索引的
  • 你能给我们举个例子来说明价值、列出、开始和结束那个产品的例外吗?此外,您可能希望使用 list 以外的变量名称,因为您正在使用内置类型。当我使用列表类型时,我通常使用数据作为名称。
  • 伪代码使用包含上限,这意味着end 是一个有效索引。您必须将len(a) - 1 作为end 参数传递。

标签: python algorithm recursion indexing


【解决方案1】:

您是否正确使用了“开始”和“结束”?我刚刚运行了你的函数,它适用于不在列表中的值(返回 False)。

【讨论】:

    【解决方案2】:

    由于已经给出了答案,我建议您尝试从另一个角度解决问题 - 通过测试:

    每当我使用不在列表中的值,但它可以很好地查找列表中的值

    有趣的是,代码不会在数组中的每个数字上失败。尝试使用array = range(1,10,2) 并搜索例如2, 4, 6, 8 -- 都不在数组中。它会起作用的。搜索 10 会失败。这暗示限制检查可能有问题,而不是实现本身。

    任何帮助将不胜感激

    这是一种测试您的功能并快速查看它失败的数字的方法:

    from itertools import izip_longest as izipl
    def complement(a):
        return list(set(range(min(a), max(a) + 10)) - set(a))
    array = range(1,10,2)
    c_array = complement(array)
    start = 0
    end = len(array) # that's the culprit
    try:
        for a,b in izipl(array, c_array):
            if a:
                assert binarySearchRec(a, array, start, end), "expected to find %s" % a
            if b:
                assert not binarySearchRec(b, array, start, end), "did not expect to find %s" % b
            print  "worked on", a, b
    except:
        print "failed on", a, b
    else:
        print "all is well"
    => 
    worked on 1 2
    worked on 3 4
    worked on 5 6
    worked on 7 8
    failed on 9 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多