前言
《改变未来的九大算法》算是我读完的第二本与技术相关的书,但却不是读的第二本书,中间也在读《程序员的自我修养》,《白帽子讲WEB安全》等,不过由于精力和时间有限,无法做到开发安全双修,因此先把安全暂放了;
正文
非常非常非常浅显易懂的实用算法科普,用很简明的例子介绍了搜索引擎匹配与排名、公钥加密、纠错码、模式识别、数据压缩、数据库、数字签名、这九种生活中常见的算法。
优点是浅显易懂,在我不了解的领域可以让我很快把握其最浅显的原理。而缺点同样是浅显易懂,在我比较熟悉的领域会发现作者的介绍实在是浅尝辄止,不够全面,也因为用的毕竟是比喻的方式,而使算法原意有所损失。
第一章 搜索引擎算法
- 匹配 match + 排名 rank;
- 匹配 - 索引:单词索引、单词位置索引、包含元词的单词位置索引;
第二章 PageRank
- 超链接链入个数、超链接传递权重、随机访问者模拟算法;
- 对抗网络垃圾 -> 基于链接的排名算法;
- 在真实互联网进行模拟耗时过长 -> 数学方法;
第三章 公钥加密
- 生成共享密钥 -> 加密;
- 迪菲–赫尔曼方法(密钥交换算法)生成共享密钥的步骤:
1、选定双方私钥;
2、发布公钥(基数、钟大小),钟大小为素数,基数为钟大小的本原根;
3、双方用离散指数(幂函数+钟算)生成 PPN 并发布:PPN = 基数 ^ 私钥(钟大小);
4、再次运用离散指数,用对方 PPN 与自己私钥生成共享密钥:- 共享密钥 = 对方 PPN ^ 私钥 (钟大小);
- 加密方式:共享密钥、多次分块加密;
第四章 纠错码
- 发现并纠正计算机在存储和传输数据时发生的错误;
- 重复、冗余、(简单、阶梯、加密哈希函数)校验和、二维奇偶校验码;
第五章 图形识别
- 模式识别:KNN、DT、ANNs;
第六章 数据压缩
-
无损压缩:
- 行程长度编码:将相邻的重复数据块进行压缩(一般和别的压缩方法结合使用);
- ZIP格式:同前(LZ77)+更短符号(每个文件块都生成独特的数字码表,如霍夫曼编码);
-
有损压缩:
- 抛弃:隔行/隔列删除(少用);
- JPEG 格式 / MP3 和 ACC 格式:文件被分成块,看每个块是否符合某种模式,如固定色、渐变色等;
-
压缩(消除低效冗余)<=> 纠错(添加高效冗余);
第七章 数据库
-
保持数据库一致性:
1、开始交易 -> 执行数个操作 -> 终止交易;
2、预写日志记录(待办事项表 -> 原子态交易);
3、回滚(备份 vs 复制数据库,磁盘空间耗尽、死锁);
4.、两阶段提交协议(阶段一:预备(锁定该行),阶段二:提交 / 回滚); -
关系数据库:多表策略
1、优点:消除重复、节省空间,易于变更;
2、键查询(用B树计算块);
3、虚表(根据需求临时生成);
第八章 数字签名
钥匙 -> 挂锁结构:
乘法挂锁:
- 选取挂锁值(私有保密)、钥匙值(受信银行)、钟大小(受信银行);
- 上锁:数据 * 挂锁值(钟大小)= 数字签名;
- 公开数据和数字签名;
- 解锁:数字签名 * 钥匙值(钟大小)= 数据;
- 若是长消息,则将之分为等于或小于钟大小的块,再进行处理;
-
受信银行(即认证机构)并非为钥匙和钟大小保密,而是他们的授信权威。
-
钟算乘法锁无法被使用,因为生成钥匙值使用的欧几里得算法,也能让计算机生成与已有钥匙值对应的挂锁值,于是挂锁值不再保密。
指数挂锁 RSA:
-
上锁:数据 ^ 挂锁值(钟大小)= 数字签名;
-
解锁:数字签名 ^ 钥匙值(钟大小)= 数据;
-
选定挂锁值,就能轻易计算出合适的钥匙值,但其他任何人无法用钥匙和钟大小高效地算出对应的挂锁值,弥补了乘法挂锁的缺陷。
第九章 并非万能的算法
- 不可判定问题:不能通过编写计算机程序解决的问题;
- 崩溃问题:可以证明不可能存在一个能侦测所有计算机程序中所有潜在崩溃的自动化软件检查器;
- 停机问题:可以证明不可能存在一个能判定所有计算机程序最终是否会结束的自动化软件检查器;
- 邱奇 - 图灵论题:所有计算机(还有可能包括人)具有相同计算能力,并非只有计算机有不可判定性限制,同样的限制也适用于人类的理智;
后记
这一路,风尘仆仆,且行且珍惜吧!