使用伪代码时Python二进制搜索算法出错

时间:2015-11-13 20:52:41

标签: python algorithm recursion indexing

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

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)

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

2 个答案:

答案 0 :(得分:0)

你正在使用&#39; start&#39;并且&#39;结束&#39;正常吗?我刚刚运行了你的函数,它适用于不在列表中的值(返回False)。

答案 1 :(得分:0)

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

  

每当我使用一个不在列表中的值,但它可以正常查找列表中的值

有趣的是,代码不会在不在数组中的每个数字上失败。尝试使用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