算法图解笔记
很好的算法入门书籍,基于Python讲解,好理解。
算法的时间复杂度一般有几种,O(1),O(log N),O(N),O(N*log N),O(N2),O(N!),O(2N)。
时间复杂度指的不是算法运行的时间,而是操作次数,表达的是随着规模N增大,操作次数增长的速度。而且时间复杂度是忽略常数的,在表达增速上常数的意义不大。
O(1),常数时间,这样的算法包括散(哈希)表。
O(log n),也叫对数时间,这样的算法包括二分查找。
O(n),也叫线性时间,这样的算法包括简单查找。
O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。
O(n2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。
O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。
O(2n),这样的算法包括集合求所有子集个数。
目录如下:
第 1 章 算法简介 ............................................. 1 1.1 引言 .......................................................... 1 1.1.1 性能方面 ....................................... 1 1.1.2 问题解决技巧 ............................... 2 1.2 二分查找 ................................................... 2 1.2.1 更佳的查找方式 ............................ 4 1.2.2 运行时间 ....................................... 8 1.3 大 O 表示法 .............................................. 8 1.3.1 算法的运行时间以不同的速度 增加 ............................................... 9 1.3.2 理解不同的大 O 运行时间 ........... 10 1.3.3 大 O 表示法指出了最糟情况下 的运行时间 .................................. 12 1.3.4 一些常见的大 O 运行时间 ........... 12 1.3.5 旅行商 .......................................... 13 1.4 小结 ......................................................... 15 第 2 章 选择排序 ............................................ 16 2.1 内存的工作原理 ...................................... 16 2.2 数组和链表 .............................................. 18 2.2.1 链表 .............................................. 19 2.2.2 数组 .............................................. 20 2.2.3 术语 .............................................. 21 2.2.4 在中间插入 .................................. 22 2.2.5 删除 .............................................. 23 2.3 选择排序 .................................................. 25 2.4 小结 ......................................................... 28 第 3 章 递归 .................................................... 29 3.1 递归 ......................................................... 29 3.2 基线条件和递归条件 ............................... 32 3.3 栈 ............................................................. 33 3.3.1 调用栈 .......................................... 34 3.3.2 递归调用栈 .................................. 36 3.4 小结 ......................................................... 40 第 4 章 快速排序 ............................................ 41 4.1 分而治之 .................................................. 41 4.2 快速排序 .................................................. 47 4.3 再谈大 O 表示法 ..................................... 52 4.3.1 比较合并排序和快速排序 ........... 53 4.3.2 平均情况和最糟情况 ................... 54 4.4 小结 ......................................................... 57 第 5 章 散列表 ................................................ 58 5.1 散列函数 .................................................. 60 5.2 应用案例 .................................................. 63 5.2.1 将散列表用于查找 ....................... 63 5.2.2 防止重复 ...................................... 64 5.2.3 将散列表用作缓存 ....................... 66 5.2.4 小结 .............................................. 68 5.3 冲突 ......................................................... 69 5.4 性能 ......................................................... 71 5.4.1 填装因子 ...................................... 72 5.4.2 良好的散列函数 .......................... 74 5.5 小结 ......................................................... 75 第 6 章 广度优先搜索 ................................... 76 6.1 图简介 ..................................................... 77 6.2 图是什么 .................................................. 79 6.3 广度优先搜索 .......................................... 79 6.3.1 查找最短路径 .............................. 82 6.3.2 队列 .............................................. 83 6.4 实现图 ..................................................... 84 6.5 实现算法 ................................................. 86 6.6 小结 ......................................................... 93 第 7 章 狄克斯特拉算法 ............................... 94 7.1 使用狄克斯特拉算法 .............................. 95 7.2 术语 ......................................................... 98 7.3 换钢琴 ................................................... 100 7.4 负权边 ................................................... 105 7.5 实现 ....................................................... 108 7.6 小结 ....................................................... 116 第 8 章 贪婪算法 .......................................... 117 8.1 教室调度问题 ........................................ 117 8.2 背包问题 ............................................... 119 8.3 集合覆盖问题 ........................................ 121 8.4 NP 完全问题 .......................................... 127 8.4.1 旅行商问题详解 ........................ 127 8.4.2 如何识别 NP 完全问题 .............. 131 8.5 小结 ....................................................... 133 第 9 章 动态规划 .......................................... 134 9.1 背包问题 ............................................... 134 9.1.1 简单算法 .................................... 135 9.1.2 动态规划 .................................... 136 9.2 背包问题 FAQ ....................................... 143 9.2.1 再增加一件商品将如何呢 ......... 143 9.2.2 行的排列顺序发生变化时结果将如何 ................................ 145 9.2.3 可以逐列而不是逐行填充网格吗 ........................................ 146 9.2.4 增加一件更小的商品将如何呢 ........................................... 146 9.2.5 可以偷商品的一部分吗 ............. 146 9.2.6 旅游行程最优化 ........................ 147 9.2.7 处理相互依赖的情况 ................. 148 9.2.8 计算最终的解时会涉及两个以上的子背包吗 .................... 148 9.2.9 最优解可能导致背包没装满吗 ........................................... 149 9.3 最长公共子串 ........................................ 149 9.3.1 绘制网格 .................................... 150 9.3.2 填充网格 .................................... 151 9.3.3 揭晓答案 .................................... 152 9.3.4 最长公共子序列 ........................ 153 9.3.5 最长公共子序列之解决方案 ..... 154 9.4 小结 ....................................................... 155 第 10 章 K 最近邻算法 ............................... 156 10.1 橙子还是柚子 ...................................... 156 10.2 创建推荐系统 ...................................... 158 10.2.1 特征抽取 ................................ 159 10.2.2 回归 ....................................... 162 10.2.3 挑选合适的特征 .................... 164 10.3 机器学习简介 ...................................... 165 10.3.1 OCR(光学字符识别(optical character recognition)) ....................................... 165 10.3.2 创建垃圾邮件过滤器 ............ 166 10.3.3 预测股票市场 ........................ 167 10.4 小结 ..................................................... 167 第 11 章 接下来如何做 ............................... 168 11.1 树 ......................................................... 168 11.2 反向索引 ............................................. 171 11.3 傅里叶变换 .......................................... 171 11.4 并行算法 ............................................. 172 11.5 MapReduce .......................................... 173 11.5.1 分布式算法为何很有用 ......... 173 11.5.2 映射函数 ................................ 173 11.5.3 归并函数 ................................ 174 11.6 布隆过滤器和 HyperLogLog ............... 174 11.6.1 布隆过滤器 ............................ 175 11.6.2 HyperLogLog ......................... 176 11.7 SHA 算法 ............................................ 176 11.7.1 比较文件 ................................ 177 11.7.2 检查密码 ................................ 178 11.8 局部敏感的散列算法 .......................... 178 11.9 Diffie-Hellman 密钥交换 .................... 179 11.10 线性规划 ........................................... 180 11.11 结语 ................................................... 180 练习答案 ........................................................... 181
这里介绍的算法还是比较简单。
递归:讲了递归和调用栈的关系,递归可能引起栈溢出导致程序终止。
排序:讲了选择排序,快速排序(分而治之,找基准值,递归)。合并排序只提了下,和快排一个复杂度,但比快排慢。其他排序没提:冒泡排序,堆排序,希尔排序,桶排序,基数排序等。
查找:讲了散列表(用作缓存,冲突,合理的填装因子和散列函数来提高性能),二分查找。其他查找没提等。
图:讲了广度优先搜索(解决有向无权重无环图的最短路径问题,用到了队列和散列表),讲了狄克斯特拉算法(解决有向带权重无负权边无环图的最优路径问题,用到了3个散列表,例子换钢琴)
贪心算法:解决高复杂度问题求最优解的方法,求近似结果,教室调度,背包问题,集合覆盖问题。近似算法,NP完全问题识别:集合覆盖问题,旅行商问题详解。
#集合覆盖问题
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]) stations = {} stations["kone"] = set(["id", "nv", "ut"]) stations["ktwo"] = set(["wa", "id", "mt"]) stations["kthree"] = set(["or", "nv", "ca"]) stations["kfour"] = set(["nv", "ut"]) stations["kfive"] = set(["ca", "az"]) final_stations = set() while states_needed: best_station = None states_covered = set() for station, states in stations.items(): covered = states_needed & states if len(covered) > len(states_covered): best_station = station states_covered = covered states_needed -= states_covered final_stations.add(best_station) >>> print final_stations set(['ktwo', 'kthree', 'kone', 'kfive'])
动态规划:通过绘制网格解决问题,分而治之,网格的算法可能不同。背包问题,最长公共子串/序列。
K最近邻算法:推荐系统(分类,回归)。
最后一章,接下来如何做:
1、查询、插入和删除时间复杂度都较高为O(log N)的数据结构--树。高级数据结构:B树(数据库常用它来存储数据),红黑树,堆,伸展树。
2、反向索引:散列表<单词,包含单词的网页集合>,搜索引擎的工作原理。
3、傅里叶变换:给它一杯冰沙,它能告诉你其中包含哪些成分。可将歌曲分解成不同频率,可以强化低音并隐藏高音;可以压缩音乐,将不重要的音符删除,MP3格式的工作原理;图像压缩成JPG格式;地震预测;DNA分析;音乐识别软件。
4、并行算法:很难设计,速度提升并非线性。原因两个:并行性管理开销,比如排序并行计算后的合并也需要时间。负载均衡,