算法图解:第9-11章动态规划、KNN、下一步
背包问题:简单算法需计算所有组合,时间复杂度(2^n)
动态规划解决背包问题,先解决小背包(子背包)问题。
创建网格,每个网格代表切割后小背包的容量;
横轴背包容量,纵轴待放入的物品,遍历每一个物品行的最大价值,该行可选的物品为该行的物品+该行之前的物品。
在背包容量约束下,最后一行可算出最优的组合。
旅行行程也可采用动态规划,通过网格,在最后一行得出时间约束下的最优解。
最长公共子串,有点像邻接矩阵,两个子串分别是横轴纵轴,字母相等为1,不等为0。案例中,对于相同字母,要在之前的相同字母的计数上加1。
//最长公共子串伪代码
if word_a[i] == word_b[j]:
cell[i][j] = cell[i-1][j-1]
else:
cell[i][j] = 0
//最长公共子串序列
if word_a[i] == word_b[j]:
cell[i][j] = cell[i-1][j-1]
else:
cell[i][j] = max(cell[i-1][j], cell[i][j-1])
算法图解:第十章k最近邻算法KNN
基于个头和颜色区分橙子和柚子,位于中间的如何区分?
找到中间水果的三个邻居,邻居中橙子比柚子多,则该水果为橙子。
推荐电影系统
找到与net最近的五个朋友,推荐他们喜欢的电影给net。
通过特征计算相似性。毕达哥斯公式,平方差和开平方。余弦相似度。
KNN进行分类和回归
基于天气、节假日、是否有活动预测售卖的面包数
机器学习简介:OCR光学字符识别,第一步查看大量的数字图像并提取特征,基于KNN理念。
朴素贝叶斯过滤器,创建垃圾邮件过滤器,计算是垃圾邮件的概率。
第11章 接下来如何做
1.二分查找树
二分查找在有序数组有效,插入和删除需要挪很多数组。二分查找树,查找/插入/删除的平均复杂度都是O(log n),最坏情况是O(n)。
二分查找树,左节点比根节点小,右节点比根节点大。
缺点:不能随机访问,如让找第五个元素,二叉树为平衡状态时,复杂度为O(log n),不平衡时,如左倾斜或右倾斜接近于O(n)。
处于平衡状态的二叉树:红黑树。
B树是一种特殊的二叉树,数据库用它来存储数据。
了解数据库或高级数据结构可研究:B树、红黑树、堆、伸展树
2.反向索引
搜索引擎,三个网页,散列表存储网页,键为单词,值为包含单词的指定文件。
一个散列表,将单词映射到包含它的页面,这种数据结构为反向索引。
3.傅立叶变换
属于绝妙、优雅又广泛应用的算法之一。
better explained网站解释:给它一杯冰沙,能告诉你包含哪些成分;给定一首歌曲,能分离出指定的频率。
将歌曲分为不同的频率,可强化低音隐藏高音或反之。适用于处理信号,压缩音乐。MP3,JPG压缩。将不重要的音符或像素删除。
4.并行算法
并行计算设计困难,速度的提升不是线性的。电脑比之前多装了一个内核,算法速度不能提升2倍。2个原因,一并行管理开销,1000个数组排序,每个内核分500,最后将数组合并,分配和合并有开销;二负载均衡,10个任务,每个内核5个,内核a 10s算完,内核b 1分钟算完。如何分配工作达到两个内核都一样忙。
5.mapreduce
流行的并行算法,分布式算法。用于上百个内核,计算机并行计算。
mp两个理念,映射函数map和归并函数reduce。
映射map函数,接收一个数组,对数组中的每一个元素执行同样的操作。如数组中的元素翻倍,下载url数组清单中的页面。
对于很多url,用几百台计算机,map能自动将工作分配给这些计算机。
归并函数reduce
map是将一个数组转为另一个数组。归并是将一个数组转为一个元素。如将数组中所有的元素相加。
6.布隆过滤器和hyoerloglog
万亿网页索引,判断网页以前是否已搜集,不用散列表,用布隆过滤器,可能出现错报,但不会出现漏报。
7.SHA算法
安全散列算法。用于创建散列表的散列函数根据字符串生成数组索引,SHA根据字符串生成另一个字符串,很长。散列值相同即可判断为同一个文件。
SHA存储密码,存储单向,不能反向推出原始字符串。
8.局部敏感的散列算法
SHA局部不敏感,只变更一个单词,生成的散列值截然不同。simhash对局部敏感,输入差别细微,输出的散列值也细微。判断查找内容的相似程度。
9.differ-hellman密匙交换
使用两个密匙,公匙私匙。使用公匙对发送的消息加密,用私匙解密。替代者rsa。
10.线性规划
所有的图算法都可用线性规划实现,使用simplex算法。先确定目标和约束条件。