使用分而治之技术的二进制搜索

时间:2018-02-22 10:20:09

标签: python binary-search divide-and-conquer

算法正在运行,但只能查找值是否存在。 我希望找到索引,以防它存在。我该怎么办?

def binarySearch(arr, num):
  if len(arr) == 1: #base case
    if arr[0] == num:
      return arr[0] #found
    else:
      return None #not found

  mid = int(len(arr)/2) 
  if arr[mid] > num:
    return binarySearch(arr[:mid], num)
  else:
    return binarySearch(arr[mid:], num)

print(binarySearch([1,2,3,4], 7)) #None
print(binarySearch([1,2,3,4], 3)) #3
print(binarySearch([1,2,3,4], 4)) #4
print(binarySearch([1], 2)) #None
print(binarySearch([1,2], 2)) #2

1 个答案:

答案 0 :(得分:1)

像这样传递索引:

def binarySearch(arr, num, idx=0):
  if len(arr) == 1: #base case
    if arr[0] == num:
      return idx
    else:
      return None #not found

  mid = len(arr) // 2
  if arr[mid] > num:
    return binarySearch(arr[:mid], num, idx)
  else:
    return binarySearch(arr[mid:], num, idx + mid)

print(binarySearch([1,2,3,4], 7)) #None
print(binarySearch([1,2,3,4], 3)) #2
print(binarySearch([1,2,3,4], 4)) #3
print(binarySearch([1], 2)) #None
print(binarySearch([1,2], 2)) #1

现在返回已找到的数字索引,如果它不在列表中,则返回None

如评论中所述:考虑传递开始值和结束值,而不是在每次递归时复制列表。它的编写和阅读速度更快,更容易。