使用分而治之技术的二分查找

Posted

技术标签:

【中文标题】使用分而治之技术的二分查找【英文标题】:binary search using divide and conquer technique 【发布时间】:2018-08-02 03:42:52 【问题描述】:

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

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】:

只需像这样传递索引:

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

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

【讨论】:

以上是关于使用分而治之技术的二分查找的主要内容,如果未能解决你的问题,请参考以下文章

最优子序列问题(减而治之 - 二分查找 - 分组)

减而治之 - 二分查找 - lower_bound实现原理

分治算法-二分查找

C/C++ 分治算法(二分查找算法递归实现)

C/C++ 分治算法(二分查找算法递归实现)

常见算法之二分查找