【问题标题】:Binary search program二分查找程序
【发布时间】:2018-01-08 04:25:14
【问题描述】:
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.

我该如何解决?

【问题讨论】:

  • 当你用谷歌搜索“python 3 float”、“python 3 range function”和你的错误信息时,你发现了什么?

标签: python python-3.x


【解决方案1】:

从问题 2 开始:

错误消息“范围索引必须是整数或切片,而不是浮点数”告诉您正在尝试使用浮点数而不是整数进行切片(获取类似列表的集合的一部分,例如使用 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 副本的实现,则等式可能会有所不同。您提供的实现“就地”工作,因此它需要绝对坐标。

编辑:正如 @philipxy 在 cmets 中指出的那样,您可以轻松找到导致切片相关错误的原因,搜索您的错误消息 +“除法”。

我刚刚测试了这个,第一个谷歌结果指向TypeError: list indices must be integers, not float;由于这与您的问题完全相同(二分搜索),因此如果此处不包含您的第二个问题,该问题可能会被标记为重复并关闭。事实上,一些更有经验的用户仍然可能会决定将其标记为重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多