二进制搜索程序

时间:2017-08-01 10:36:09

标签: python python-3.x

def bsearch(s, e, first, last):
    print(first, last)
    if (last - first) < 2:
        return s[first] == e or s[last] == e
    mid = first + (last - first) / 2
    if s[mid] == e: return True
    if s[mid] > e: return bsearch(s, e, first, mid - 1)
    return bsearch(s, e, mid + 1, last)

def search1(s,e):
    print(bsearch(s, e, 0, len(s)-1))
    print('Search complete')

def testSearch():
    s = range(0, 1000000)
    input('binary,-1')
    print(search1(s, -1))

它的二进制搜索算法。我有两个问题。

问题1: 为什么first在下一行中是必要的?

mid = first + (last - first) / 2

问题2: 当我运行程序时,我无法运行结果。 错误消息是:

range indices must be integers or slices, not float.

我如何解决?

1 个答案:

答案 0 :(得分:0)

从问题2开始:

错误消息&#34;范围索引必须是整数或切片,而不是浮点数&#34;告诉你,你正在尝试使用float而不是int来切片(获取类似列表的集合的一部分,例如使用some_list[5:])。更准确地说,mid5.0,而不是5

在Python 3中,默认分区是浮动分区(与Python 2不同)。要获得整数除法,您需要使用双斜杠运算符:

mid = first + (last - first) // 2

关于问题1:mid是中间元素。它是获得中间元素的基本方程,但也许你感到困惑,因为你期望另一个等价方程;它可以计算为

mid = first + (last - first) // 2

或:

mid = (first + last) // 2

如果您使用的是在每次递归调用时创建列表s的副本的实现,则等式可能会有所不同。您提供的实施工作&#34;就地&#34;所以它需要绝对坐标。

编辑:正如@philipxy在评论中指出的那样,您可以轻松找到导致切片相关错误的原因,搜索您的错误消息+&#34; division&#34;。

我刚刚对此进行了测试,并将第一个Google结果指向TypeError: list indices must be integers, not float;因为这与您的问题(二进制搜索)完全相同,如果不是您在此处包含的第二个问题,则可以将此问题标记为重复并关闭。事实上,一些更有经验的用户仍然可以决定将其标记为重复。