二分查找是一种简单高效的搜索算法
不过前提必须为进行搜索的数组为有序的
一般情况下的实现方法中mid的取值为(low+high)/2的整数
但试想一下如果mid改为round值的话会不会提高搜索的效率呢
下面为一般情况的实现
def binary_search(a, t, debug=False): l = 0 h = len(a) while l <= h: mid = (l + h) // 2 if debug: print('law=', l, ';high=', h, ';mid=', mid, sep='') if a[mid] == t: return mid elif a[mid] < t: l = mid + 1 else: h = mid - 1 return -1
下面为增加了round的实现
def binary_search_with_round(a, t, debug=False): l = 0 h = len(a) while l <= h: mid = round((l + h) / 2) if debug: print('law=', l, ';high=', h, ';mid=', mid, sep='') if a[mid] == t: return mid elif a[mid] < t: l = mid + 1 else: h = mid - 1 return -1
对两种情况进行实验
if __name__ == '__main__': a = [1, 3, 4, 7, 9, 10, 11, 15] print(binary_search(a, 4, True)) print(binary_search(a, 5, True)) print(binary_search_with_round(a, 4, True)) print(binary_search_with_round(a, 5, True))
最后得到的结果为
law=0;high=8;mid=4 law=0;high=3;mid=1 law=2;high=3;mid=2 2 law=0;high=8;mid=4 law=0;high=3;mid=1 law=2;high=3;mid=2 law=3;high=3;mid=3 -1 law=0;high=8;mid=4 law=0;high=3;mid=2 2 law=0;high=8;mid=4 law=0;high=3;mid=2 law=3;high=3;mid=3 -1效果还不错,两次都减少了一次