Python列表中的二进制搜索

问题描述

好吧,您的代码中有些小错误。要找到它们,您应该使用调试器,或者至少添加跟踪以了解会发生什么。这是您的原始代码,带有使问题显而易见的跟踪:

def search(list, target):
  min = 0
  max = len(list)-1
  avg = (min+max)/2
  print list, target, avg
  ...

您可以立即看到:

  • 你在一个子阵列跳过搜索avg-1时,你是 低于 平均
  • 当你在一个子阵列搜索,你会得到该指数 在子阵

修复程序现在很简单:

elif (list[avg] < target):
      return avg + 1 + search(list[avg+1:], target)  # add the offset
    else:
      return search(list[:avg], target)  # sublist ends below the upper limit

这还不是全部,当您以结束循环时min == max,您不会返回任何内容(意味着您将返回None)。最后但并非最不重要的一点是, 为自己的变量使用标准Python库中的名称

所以这是固定代码

def search(lst, target):
  min = 0
  max = len(lst)-1
  avg = (min+max)/2
  # uncomment next line for traces
  # print lst, target, avg  
  while (min < max):
    if (lst[avg] == target):
      return avg
    elif (lst[avg] < target):
      return avg + 1 + search(lst[avg+1:], target)
    else:
      return search(lst[:avg], target)

  # avg may be a partial offset so no need to print it here
  # print "The location of the number in the array is", avg 
  return avg

解决方法

我正在尝试在python中的列表上执行二进制搜索。列表是使用命令行参数创建的。用户输入要在数组中查找的数字,然后返回该元素的索引。由于某种原因,该程序仅输出1和无。代码如下。任何帮助都非常感谢。

import sys

def search(list,target):
  min = 0
  max = len(list)-1
  avg = (min+max)/2
  while (min < max):
    if (list[avg] == target):
      return avg
    elif (list[avg] < target):
      return search(list[avg+1:],target)
    else:
      return search(list[:avg-1],target)

  print "The location of the number in the array is",avg

# The command line argument will create a list of strings                               
# This list cannot be used for numeric comparisions                                     
# This list has to be converted into a list of ints                                     
def main():

  number = input("Please enter a number you want to search in the array !")
  index = int(number)
  list = []
  for x in sys.argv[1:]:
    list.append(int(x))
  print "The list to search from",list

  print(search(list,index))

if __name__ == '__main__':
  main()

CL :
Anuvrats-MacBook-Air:Python anuvrattiku$ python binary_search.py 1 3 4 6 8 9 12 14 16 17 27 33 45 51 53 63 69 70
Please enter a number you want to search in the array !69
The list to search from [1,3,4,6,8,9,12,14,16,17,27,33,45,51,53,63,69,70]
0
Anuvrats-MacBook-Air:Python anuvrattiku$