《算法图解》之二分查找

252 阅读2分钟

Binary search algorithm

在计算机科学中,二分查找算法(英语:binary search algorithm),也称折半搜索算法(英语:half-interval search algorithm)、对数搜索算法(英语:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

log10100\log_{10}{100} 相当于问“将多少个10相乘的结果为100”。答案是两个:10 × 10 = 100。因此,log10100\log_{10}{100} = 2。对数运算是幂运算的逆运算。

使用大O表示法讨论运行时间时,log指的都是log2\log_{2}。使用简单查找法查找元素时,在最糟情况下需要查看每个元素。因此,如果列表包含8个数字,你最多需要检查8个数字。而使用二分查找时,最多需要检查logn\log{n}个元素。如果列表包含8个元素,你最多需要检查3个元素,因为log8\log{8} = 3。如果列表包含1024个元素,你最多需要检查10个元素,因为log1024\log{1024} = 10。

Python 代码

def binary_search(list, item):
  low = 0
  high = len(list) - 1
  
  while low <= high:
    mid = (low + high) / 2
    guess = list[mid]
    if guess == item:
      return mid
    if guess > item:
      high = mid - 1
    else:
      low = mid + 1
  return None
  
my_list = [1, 3, 5, 7, 9]
print binary_search(my_list, 3) # => 1
print binary_search(my_list, -1) # => None

Python在线运行(2.7.17)

JavaScript 代码

var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15, 19, 20];
function binarySearch (arr, val) {
    var low = 0,
    high = arr.length - 1;
    while (low <= high) {
        var mid = parseInt( (low + high) / 2 );
        if (val === arr[mid]) {
            return mid;
        }else if (val > arr[mid]) {
            low = mid + 1;
        }else if (val < arr[mid]) {
            high = mid - 1;
        }
    }
    return -1;
};  
console.log( binarySearch(arr, 5) );

Ruby 代码

def binarySearch(arr, value)
    low = 0
    high = arr.length - 1
    while low <= high
      mid = (low + high) / 2
      if arr[mid] == value
        return mid
      elsif arr[mid] < value
        low = mid + 1
      else
        high = mid - 1
      end
    end
    return -1
end

arr1 = [1,2,3,4,5,6,7,8]
p binarySearch(arr1, 2)

Ruby 在线开发工具