python - 在排序列表中找到大于给定数字的最小数字

标签 python algorithm binary-search

给定一个排序的数字列表,我需要找到大于给定数字的最小数字。考虑这个列表:


arr=[1,2,3,5,7,11,101,131,151,181,191,313,353,373,383]

假设指定的数字是 320。那么,我的方法应该返回 353,因为 353 是大于 320 的最小数字。

我正在尝试使用一种稍微修改过的二进制搜索形式;但是在执行时程序进入无限循环。


def modBinarySearch(arr,x):
    l=len(arr)
    mid=l/2
    if arr[mid]>=x and arr[mid-1]<x:
        return arr[mid]
    elif arr[mid]>x and arr[mid-1]>x:
        modBinarySearch(arr[mid:l],x)
    else: 
        modBinarySearch(arr[0:mid],x)

N=int(raw_input())
arr=[1,2,3,5,7,11,101,131,151,181,191,313,353,373,383]
print modBinarySearch(arr,N)

有人可以指出我做错了什么吗?

最佳答案

有一个标准模块,bisect ,这已经做到了:

In [49]: arr[bisect.bisect(arr, 320)]
Out[49]: 353

我认为这应该是搜索排序列表的首选方法。有几个examples在手册中。

至于您的实现,存在一些问题:

  1. 您的递归无法正确处理小型数组。
  2. 第二个分支中的切片不正确。
  3. 您的函数不返回任何内容。
  4. 因为arr是升序的,所以arr[mid]>x和arr[mid-1]>x等价于arr[mid-1 ]>x,暗示你没有写出你的意思

最后但同样重要的是,递归和所有切片对于这个问题来说是完全不必要的。

关于python - 在排序列表中找到大于给定数字的最小数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669770/

相关文章:

python - 有没有更优雅的方法在Python中将整数列表转换为WORD(C_Types)数组

python - 在 C++ 中返回 vector 中元素的第一个索引

javascript - 检查是否所有图 block 都已连接

java - 不带库方法的二分查找

algorithm - 二分查找插入排序

java - Java中使用二分查找实现二分插入排序

python - 如何将 DataFrame 拆分为 FirstName 列和 LastName 列

Python检测kill请求

java - 二维数组,使用 HashMap 的最佳平均计算器

algorithm - 何时使用 Big O 而不是 theta 或 little o