读书笔记-《我的第一本算法书》

我的第一本算法书作者是两个日本人,宫崎修一和石田保辉。讲解直白易懂,解释过程的图片较多,比较适合算法初学者入门。我是在微信读书上读到的这本书。主要是用于长时间未接触算法后的适应性恢复阅读。

一、关于作者
石田保辉是日本京都大学研究生毕业,2016年,自己开发了学习型App“算法动画图解”,该App不到一年时间全球下载量已达50万次,入选“App Store日本区2016年度最佳应用榜单”。
宫崎修一,京都大学副教授,主要研究算法和计算复杂性理论,著作有《图论入门:基本知识和算法》。

二、主要内容

0.序章
按照惯例解释了算法的概念,比较了与程序的区别,介绍了时间复杂度的计算方法,有意思的是列举了一个全排列算法的例子。该算法说,50个数,随机生成一个序列,判断该序列是否有序,如果有序则输出,无序则重新生成之前没有生成过的序列。时间复杂度计算如下:

50!> 5049···1312*11 > 10^40

假设一台高性能计算机1s可以检查1012个数列,那么检查1040个数列花费的时间将为1028s,1年为31536000s,1028s > 1020年。
从大爆炸开始宇宙已经经历了约137亿年,少于1011年。
就是说,用这个算法仅仅对50个数排序,就算花费宇宙年龄的109倍也算不完。

1.第一章
介绍了数据结构的概念,并列举了7种数据结构,值得注意的是这本书把数组也作为一种数据结构介绍,加上链表、栈、队列、哈希表、堆、二叉查找树,共7种。
至于数组到底是不是一种数据结构,需要看情况以及个人理解。
然后其中哈希表使用了哈希函数,在哈希函数的使用中会发生“冲突”的情况,解决这种冲突可以使用“链地址法”和“开放地址法”,开放地址法中需要计算候补地址,计算候补地址又可以通过多次使用哈希函数或“线性探测法”。
此处需要提醒二叉查找树、二叉搜索树和二叉排序树是同一种数据结构,我曾经有同学在考试时遇到,因为试卷的提法跟自己记忆中不一样而答错题。另,B树(也叫B-树)和B+树是面试时常问的数据结构,准备求职的话需要重视。

2.第二章
介绍了冒泡排序、选择排序、插入排序、堆排序、归并排序和快速排序共6种基本排序,前三种复杂度为O(n2),后三种为O(nlogn),归并排序和快速排序是递归的,此外我们日常提到的八大排序还有希尔排序和基数排序,同时这本书中没有提到排序算法稳定性的问题,读者需要额外自学。

3.第三章
讲了线性查找和二分查找。

4.第四章
讲了图的基本概念,以及DFS(深度优先搜索)、BFS(广度优先搜索),DFS可以用栈辅助实现,BFS可以用队列辅助实现。然后又介绍了贝尔曼福特算法、Dijkstra(迪杰斯特拉)算法和A*(A-Star)算法3种求最短路径的算法,其中贝尔曼需要遍历边,允许出现负权重的边,Dijkstra优先搜索最近顶点,不允许出现负权重的边,A*则是启发式搜索,多用于游戏编程。

5.第五章
讲了安全算法,提及传输数据时的四个问题:窃听、假冒、篡改和事后否认。加密可以防止窃听,消息认证码和数字签名则可以解决假冒和篡改的问题,数字签名可以预防事后否认。
这一章也提到了哈希函数,并提及了哈希函数的3种算法,MD5、SHA-1、SHA-2,如果有人感兴趣可以自行深入了解。
这一章里介绍了很多密钥,共享密钥、公开密钥、私有密钥。也列举了实现共享密钥加密的算法:凯撒密码、AES、DES、动态口令。也提到“密钥分配问题”,并介绍了“密钥交换协议”和“公开密钥加密”。
有意思的是,二战中德军所用的恩尼格玛密码机(Enigma)就使用了共享密钥加密,被英国数学家艾伦·图灵破译。
公开密钥加密,也叫非对称加密,加密用的密钥叫公开密钥,解密用的叫私有密钥实现公开密钥加密的算法有RAS何椭圆曲线加密算法。RAS算法由其三个开发者的首字母命名,三人在2002年获得图灵奖。
这一章还提到一种攻击方法,叫做“中间人攻击”,通过中途替换公开密钥窃听数据。
共享密钥加密不够安全,公开密钥加密速度慢,结合这两种方法的改良方法就叫混合加密,SSL/TLS协议就使用了混合加密。
还介绍了迪菲-赫尔曼密钥交换,该算法利用了数学难题-离散对数问题,两位提出人在2015年获得了图灵奖。
消息认证码,简称MAC,计算算法有HMAC、OMAC、CMAC。
最后介绍了数字签名和数字证书。

6.第六章
介绍了聚类,以及K-means算法,该算法属于人工智能范畴。

7.第七章
介绍了欧几里得算法(辗转相除法)、素性测试、网页排名和汉诺塔。
素性测试中有一种叫费马测试,该测试使用了“费马小定理”。还提到RS算法中用的就是费马测试改进后的“米勒-拉宾素性测试”,费马小定理也存在例外,不符合费马小定理的数就叫“卡迈克尔数”,也叫绝对伪素数。
网页排名,也叫佩奇排名,是谷歌的搜索引擎最初使用的算法,另外,网页出现环路可以用“随机游走模型”解决。
汉诺塔,一种简单的递归算法,运行时间:

T(n) = 2n - 1

三、阅读感悟
这本书主要是用于入门,只介绍了一点入门算法,还有很多基本算法尚未提及,不过提到的算法都介绍得非常详细,直白易懂,是一本不错的科普书。如果想深入学习算法还是要多看看刘汝佳或者罗勇军的算法书并找些刷题网站实践。

你可能感兴趣的:(读书笔记,算法,数据结构,排序算法)