vlambda博客
学习文章列表

算法图解与剑指offer - 二分查找


目录


一维数组 二分查找

二维数组 二分查找


二分查找

    二分查找是一种算法,其输入是一个有序的元素列表。如果要找的元素包含在列表中,二分查找返回其位置;否则返回null。


一维数组 二分查找

题目: 函数binary_search接受一个有序数组和一个元素。如果指定的元素包含在数组中,这个函数将返回其位置。

数据:一维数组 (并已排序)

时间复杂度:  log2n  一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步(log2100相当于问“将多少个2相乘的结果为100”),而简单查找最多需要n步。

算法核心:在查找表中不断取中间元素与查找值进行比较,以二分之一的倍率进行表范围的缩小。


def binary_search(list, item): low = 0 high = len(list) -1 ## 索引来表示位置 while low <= high: mid = round((low + high) / 2.) guess = list[mid] # print(mid) if guess < item: low = mid + 1 elif guess > item: high = mid - 1 else: return mid
return None
if __name__ == '__main__': my_list = [1, 3, 5, 7, 9, 12, 22, 45, 66, 75] Rindex = binary_search(my_list, 12) print(Rindex) print(my_list[Rindex])


二维数组 二分查找

题目:在一个二维数组中找到数字7,则返回true,如果没有找到,则返回false。

数据:二维数组 (并已排序)

时间复杂度:

算法核心:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

查找过程:

注 :重要的两部分

1. 循环条件:

2. 判断条件以及执行内容

import numpy as np

def binary_search(arr, item): rows = arr.shape[0] cols = arr.shape[1]
## index row = 0 columns = cols - 1
while (columns >= 0 and row < rows): if item == arr[row, columns]: # return ("row:"+str(row+1), "columns:"+str(columns+1)) return True elif item < arr[row, columns]: columns -= 1 else: row += 1
return False

if __name__ == '__main__': arrTest = np.array([[1, 2, 8, 9, 14], [2, 4, 9, 12, 16], [4, 7, 10, 13, 17], [6, 8, 11, 15, 19]]) item = 7
index = binary_search(arrTest, item) print(index)


应用 :

1 数据库注释

2 根据 id 提取序列

3 查找数据



参考:

书籍 《算法图解》

书籍 《剑指offer》