这本书真的浅显易懂,看完之后会对一些算法的理解更好一点。
好了,以下是我的一些笔记,内容大概是全书框架加一些手写的感想以及手写的代码(其中我觉得这本书讲的最好最浅显易懂的就是选择排序和快速排序了),算法推导的话,后面的广度优先搜索,狄克斯特拉算法,贪婪算法,动态规划以及K近邻这些很重要的算法也都是十分好理解。
第一章
二分法查找
初学时间复杂度的判断:(常见的复杂度)
O(1)
O(logn)
O(n)
O(n*logn)
O(n ** 2)
O(n!)
O(2 ** n)
第二章
数组和链表
选择排序(浅显易懂),有两种写法:
一种是每次返回最小值的下标,另一种是每次直接返回最小值
def select_min(arr):
……
return ……
def selectionSort(arr):
第三章
栈
递归:由递归基例和递归条件构成
第四章
快速排序()简称快排
这个写法也浅显易懂(每次选定递归基例并且把左右两部分进行递归)
def quickSort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot] #列表推导好用
large = [i for i in arr[1:] if i > pivot] #列表推导好用
return quickSort(less) + [pivot] + quickSort(large) #递归
print(quickSort([???])) #???是列表内容
第五章
散列表是目前接触的第一种包含额外逻辑的数据结构
散列函数(将输入映射到数字)
python提供的散列表实现为字典,可用dict来创建散列表,散列表由键和值组成(即字典的键值对)
第六章
广度优先搜索(BFS)
回答两类问题:
1.有没路径通往下一站
2.有没最短路径到达目标
最短距离(非加权图的最短路径),用于图的查找算法
图(分为非加权图和加权图),节点和边组成
队列(FIFO规则)先进先出,栈是先进后出(LIFO规则)
图由散列表实现:举个例子
graph = {}
graph['you'] = ['alice', 'Bob', 'Claire'](值为列表,即节点的所有邻居)
有向图和无向图(无向图其实就是环)
广度优先搜索的步骤:图和队列来实现广度优先搜索
1.创建一个队列用于存储需要检查的对象
2.从队列中弹出一个对象
3.检查这个对象是否是我们要的目标
4.是就ok,否的话将这个对象的所有邻居都加入队列
5.回到第二步
6.如果队列为空了,说明该对象没有目标结果
第七章
狄克斯特拉算法(加权图的最短路径)
狄克斯特拉算法包含4个步骤:
1.找出最便宜的节点,即在最短时间内可以前往的节点
2.对于该节点的邻居,检查是否有前往他们的更短路径,如果有,就更新其开销
3.重复这个过程,直到对图中的每个节点都这样做了
4.计算最短路径
这个算法要使用多个散列表,第一个存储要检查的对象,第二个存储权重
如果图中包含负权边,使用贝尔曼-福德算法
第八章
贪婪算法
寻找局部最优解,以求全局最优解
第九章
动态规划(本书最难)
用行列的表示方法来推导
第十章
K近邻算法
(机器学习的一种算法)
第十一章
其他的十种简要概述
树
反向索引
傅里叶变换
并行算法ye
MapReduce(分布式算法)
HyperLogLog(布隆过滤器算法)
SHA算法
线性规划
(这些算法以后用到再详细学习)
好了,本书基本框架在此,感觉看完对算法的理解好了不少,还是有很大帮助的这本书。
接下来继续加油。