补足基本功,特此作为读书记录。特此感谢深度眸博主的资料与博客技术分享
资料链接:http://cuijiahua.com/resource.html
目录
-
二分查找
书中以一个例子引入该算法。例:在一个电话簿中找名字以K打头的联系人,方法一:从头开始翻直到以K打头的该联系人。(简单查找);方法二:先从中间找翻到字母K,然后再去找该联系人(二分查找)。需要注意的是:电话本一定是已经按照A到Z的顺序排好序的,不然方法二将无法实现。
二分查找是一种算法:输入一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回null
图1. 图解二分查找法
书中接着提出个问题,来练习加强理解该算法,例:1~100让你猜数字,每次你猜测后我会说大了还是小了还是对了。两种解决方法如下:一.简单查找(傻找):从数字1开始猜,每次排除一个数字,直到猜测正确;二.二分查找:每次都从中间猜,每次排除一半,直到猜测正确。所以如果所猜数字是99的话,那么我们用法一将会进行99次操作,而使用二分法,则最多进行7次操作。二分查找法的优势凸显出来了。
一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步,而简单查找最多需要n步
测试代码如下:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
def binary_search(list,item): #两个位置参数
low = 0 #列表的头
high = len(list)-1 #列表的尾
while low <= high: #循环条件
mid = int((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 = range(1,101)
print(binary_search(my_list,7)) #测试7在哪里
print(binary_search(my_list,-1))#测试-1在哪里
-
大O表示法
例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。 大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
大O表示法的现阶段启示:
-
算法的速度指的并非时间,而是操作数的增速。
-
谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
-
算法的运行时间用大O表示法表示。
-
O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。(log2n书中之后都写作log n)
-
旅行商问题
旅行商前往n座城市,有种排列组合,需要执行n!次操作才能计算结果。运行时间为O(n!)对该问题的优化依旧是个计算机界的难题。
-
书中最后的小结
- 二分查找的速度比简单查找快得多。
- O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多。
- 算法运行时间并不以秒为单位。
- 算法运行时间是从其增速的角度度量的。
- 算法运行时间用大O表示法表示。
初次码字,如有错误欢迎指正