题记——在最近的研究中深感算法和数据结构知识的不足,温故而知新,特此开贴,算是复习以前的知识。本文是对《算法图解》一书的学习笔记,作为自己的知识积累,欢迎各位读者共同学习。转载请注明文章出处。
分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
算法是一组完成任务的指令,本文研究的二分查找,是这样一种查询算法:
二分查找的输入是一个有序的元素列表(注意要有序),如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null。
这个意思很简单,想想小时候做过的猜数字游戏,给十个数,0到9,抽一个数字让小朋友猜,如果比中间数小,则数字肯定在0到9的前一半,反之则在后一半,然后不停的猜下去,肯定能找到答案。这就是二分查找法。与之对比的,是简单查找法,就是从0开始猜对不对,匹配上了就是对的。这种方法最坏的情况是要猜10次。所以,书中形象的称其为傻找法。
使用二分查找的优点是,每次都可以将余下的数字排除一半,这样大大提高了查询效率,用大O表示法,其算法复杂度为logn(底数是2),简单查找是n。
所以,代码实现就是这样的:
#二分法查找算法
def binary_search(list, item):
low = 0 #起始位置为0
high = len(list) - 1 #最大序列号为列表长度减一
while low <= high: #保证列表不为空,至少有一个元素
mid = int((low + high) / 2) #中间元素的索引号取整数
guess = list[mid] #检查中间的元素,每次都猜中间的元素值
if guess == item: #猜测的数字就是答案
return mid #返回并输出中间元素的索引号
elif guess > item: #如果猜测的数字大于答案
high = mid - 1 #那么列表最大值索引号变成中间值索引号减一
else:
low = mid + 1 #当猜测的数字小于答案,最小值的索引号变成中间值索引号加一
return None
if __name__ == '__main__':
my_list = [1,3,5,7,9]
print(binary_search(my_list,7))
print(binary_search(my_list,-1))
结果是:
3
None
总结:二分查找算是非常简单的算法了,简洁明了。《算法图解》中关于这一段代码的编写有些错误,本文已经改正,并且使用python3进行编写,方便初学者对照原书进行学习。如果有更好的优化想法,欢迎交流。
备注:更新代码和注释,使其更加符合惯性思维