算法图解笔记

很好的算法入门书籍,基于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 小结 ......................................................... 152 章 选择排序 ............................................ 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 小结 ......................................................... 283 章 递归 .................................................... 29
3.1 递归 ......................................................... 29
3.2 基线条件和递归条件 ............................... 32
3.3 栈 ............................................................. 33
3.3.1 调用栈 .......................................... 34
3.3.2 递归调用栈 .................................. 36
3.4 小结 ......................................................... 404 章 快速排序 ............................................ 41
4.1 分而治之 .................................................. 41
4.2 快速排序 .................................................. 47
4.3 再谈大 O 表示法 ..................................... 52
4.3.1 比较合并排序和快速排序 ........... 53
4.3.2 平均状况和最糟状况 ................... 54
4.4 小结 ......................................................... 575 章 散列表 ................................................ 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 小结 ......................................................... 756 章 广度优先搜索 ................................... 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 小结 ......................................................... 937 章 狄克斯特拉算法 ............................... 94
7.1 使用狄克斯特拉算法 .............................. 95
7.2 术语 ......................................................... 98
7.3 换钢琴 ................................................... 100
7.4 负权边 ................................................... 105
7.5 实现 ....................................................... 108
7.6 小结 ....................................................... 1168 章 贪婪算法 .......................................... 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 小结 ....................................................... 1339 章 动态规划 .......................................... 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 小结 ....................................................... 15510 章 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 小结 ..................................................... 16711 章 接下来如何作 ............................... 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最近邻算法:推荐系统(分类,回归)。

 最后一章,接下来如何作:

 一、查询、插入和删除时间复杂度都较高为O(log N)的数据结构--树。高级数据结构:B树(数据库经常使用它来存储数据),红黑树,堆,伸展树

 二、反向索引:散列表<单词,包含单词的网页集合>,搜索引擎的工做原理。

 三、傅里叶变换:给它一杯冰沙,它能告诉你其中包含哪些成分。可将歌曲分解成不一样频率,能够强化低音并隐藏高音;能够压缩音乐,将不重要的音符删除,MP3格式的工做原理;图像压缩成JPG格式;地震预测;DNA分析;音乐识别软件。

 四、并行算法:很难设计,速度提高并不是线性。缘由两个:并行性管理开销,好比排序并行计算后的合并也须要时间。负载均衡,

相关文章
相关标签/搜索