这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。
YouTube课程图
异步图书公众号后台回复:“算法详解”,获取视频地址。
《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。
这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。
《算法详解(卷1)——算法基础》
作者:[美] 科里•奥尔索夫(Cory Althoff)
扫描二维码,一键购买
本书对以下4个主题进行了介绍。
渐进性分析和大O表示法
渐进性表示法为讨论算法的设计和分析提供了基本术语。它的关键概念是大O表示法,这是一种用于衡量算法的运行时间粒度的建模选择。我们将会看到,清晰的高层算法设计思想的一大优点就是可以忽略常数因子和低阶项,把注意力集中在算法的性能与输入长度之间的关系上。
分治算法和主方法
算法设计中不存在万能的捷径,不存在适用于所有的计算问题的一种解决问题的方法。但是,还是存在一些通用的算法设计技巧适用于一定范围内的不同领域。在本系列的第1卷中,我们将讨论“分治”技巧。分治法的思路是把一个问题分解为几个更小的子问题,然后递归地解决这些子问题,并把它们的解决方案快速组合在一起形成原始问题的解决方案。我们将讨论用于排序、整数乘法、矩阵乘法和基本的计算几何学问题的快速分治算法。我们还将讨论主方法,它是一个强大的工具,用于分析分治算法的运行时间。
随机化算法
随机化算法在运行时采用了“掷硬币”的方式,它的行为取决于掷硬币的结果。令人吃惊的是,随机化常常能够带来简单、优雅且实用的算法。其中一个经典例子是随机化的快速排序(QuickSort)算法,我们将详细介绍这个算法并分析其运行时间。我们还将在《算法详解》系列的第2卷看到随机化算法的进一步应用。
排序和选择
作为前3个主题研究的附加成果,我们将学习几个著名的排序和选择算法,包括归并排序(MergeSort)、快速排序和线性时间级的选择(包括随机化版本和确定性版本)。这些算法具有令人炫目的高速度,以至于它们的运行时间较之读取输入所需要的时间并没有多出很多。创建类似这样的“低代价基本操作”集合,既可以直接用它来操作数据,也可以将其作为更困难问题的解决方案的基本单位。
关于本书内容的更详细介绍,可以阅读每章的“本章要点”,它对每一章的内容进行了总结,特别是那些重要的概念。
《算法详解》系列其他几卷所涵盖的主题
《算法详解(卷2)》讨论了数据结构(堆、平衡搜索树、散列表、布隆过滤器)、图形基本单元(宽度和深度优先的搜索、连通性、最短路径)以及它们的应用(从消除重复到社交网络分析)。卷3重点讨论了贪婪算法(调度、最小生成树、集群、霍夫曼编码)和动态编程(背包、序列对齐、最短路径、最佳搜索树等)。卷4则介绍了NP完整性及其对算法设计师的意义,还讨论了处理难解的计算问题的一些策略,包括对试探法和局部搜索的分析。
本书经常会出现“Q.e.d”等字样,它是quod erat demonstrandum的缩写,表示“证明完毕”。在数学著作中,它出现在证明过程的最后,表示证明已经完成。
精通算法需要大量的时间和精力,那为什么要学习算法呢?
成为更优秀的程序员
读者将学习一些令人炫目的用于处理数据的高速子程序以及一些实用的数据结构,它们用于组织数据,并可以直接部署到自己的程序中。实现和使用这些算法将会扩展并提高读者的编程技巧。读者还将学习基本的算法设计范式,它们与许多不同领域的不同问题密切相关,并且可以作为预测算法性能的工具。这些“算法设计模式”可以帮助读者为自己碰到的问题设计新算法。
加强分析技巧
读者将会获得大量的实践以对算法进行描述和推导。通过数学分析,读者将对《算法详解》系列图书所涵盖的特定算法和数据结构产生深刻的理解。读者还将掌握一些广泛用于算法分析的实用数学技巧。
形成算法思维
在学习了算法之后,很难发现有什么地方没有它们的踪影。不管是坐电梯、观察鸟群,还是管理自己的投资组合,甚至是观察婴儿的认知,算法思维都如影随行。算法思维在计算机科学之外的领域,包括生物学、统计学和经济学越来越实用。
融入计算机科学家的圈子
研究算法就像是观看计算机科学最近60年的精彩剪辑。当读者参加一个计算机科学的鸡尾酒会时,会上有人讲了一个关于Dijkstra算法的笑话时,你就不会感觉自己被排除在这个圈子之外了。在阅读了本书系列之后,读者将会了解许多这方面的知识。
在技术访谈中脱颖而出
在过去这些年里,有很多学生向我讲述了《算法详解》系列图书是怎样帮助他们在技术访谈中大放异彩。
《算法详解》系列的在线课程当前运行于Coursera和Stanford Lagunita平台。另外还有一些资源可以帮助读者根据自己的心愿提升对在线课程的体验。
第1章 绪论 1
1.1 为什么要学习算法 1
1.2 整数乘法 3
1.2.1 问题和解决方案 3
1.2.2 整数乘法问题 3
1.2.3 小学算法 4
1.2.4 操作数量的分析 5
1.2.5 还能做得更好吗 5
1.3 Karatsuba乘法 6
1.3.1 一个具体的例子 6
1.3.2 一种递归算法 7
1.3.3 Karatsuba乘法 9
1.4 MergeSort算法 11
1.4.1 推动力 11
1.4.2 排序 12
1.4.3 一个例子 13
1.4.4 伪码 14
1.4.5 Merge子程序 15
1.5 MergeSort算法分析 16
1.5.1 Merge的运行时间 17
1.5.2 MergeSort的运行时间 18
1.5.3 定理1.2的证明 19
1.5.4 小测验1.1~1.2的答案 23
1.6 算法分析的指导原则 23
1.6.1 第1个原则:最坏情况分析 24
1.6.2 第2个原则:全局分析 25
1.6.3 第3个原则:渐进性分析 26
1.6.4 什么是“快速”算法 27
1.7 本章要点 28
1.8 习题 29
挑战题 31
编程题 31
第2章 渐进性表示法 32
2.1 要旨 32
2.1.1 推动力 32
2.1.2 高级思维 33
2.1.3 4个例子 34
2.1.4 小测验2.1~2.4的答案 38
2.2 大O表示法 40
2.2.1 文本定义 40
2.2.2 图形定义 40
2.2.3 数学定义 41
2.3 两个基本例子 42
2.3.1 k阶多项式是O(nk) 42
2.3.2 k阶多项式不是O(nk-1) 43
2.4 大Ω和大表示法 44
2.4.1 大Ω表示法 44
2.4.2 大表示法 45
2.4.3 小O表示法 46
2.4.4 渐进性表示法的来源 47
2.4.5 小测验2.5的答案 48
2.5 其他例子 48
2.5.1 在指数中添加一个常数 48
2.5.2 指数乘以一个常数 49
2.5.3 最大值vs.和 49
2.6 本章要点 50
2.7 习题 51
第3章 分治算法 53
3.1 分治法规范 53
3.2 以O(n log n)时间计数逆序对 54
3.2.1 问题 54
3.2.2 一个例子 54
3.2.3 协同筛选 55
3.2.4 穷举搜索法 55
3.2.5 分治法 56
3.2.6 高级算法 57
3.2.7 关键思路:站在MergeSort的肩膀上 57
3.2.8 重温Merge 58
3.2.9 Merge和分离逆序对 60
3.2.10 Merge_and_CountSplitInv 61
3.2.11 正确性 61
3.2.12 运行时间 62
3.2.13 小测验3.1~3.2的答案 62
3.3 Strassen的矩阵相乘算法 63
3.3.1 矩阵相乘 63
3.3.2 例子(n = 2) 64
3.3.3 简单算法 64
3.3.4 分治法 65
3.3.5 节省一个递归调用 67
3.3.6 细节 68
3.3.7 小测验3.3的答案 69
*3.4 O(n log n)时间的最近点对(Closest Pair)算法 70
3.4.1 问题 70
3.4.2 热身:1D情况 71
3.4.3 预处理 71
3.4.4 一种分治方法 72
3.4.5 一个微妙的变化 74
3.4.6 ClosestSplitPair 74
3.4.7 正确性 76
3.4.8 辅助结论3.3(a)的证明 77
3.4.9 辅助结论3.3(b)的证明 78
3.4.10 小测验3.4的答案 80
3.5 本章要点 80
3.6 习题 81
挑战题 81
编程题 82
第4章 主方法 83
4.1 重温整数乘法 83
4.1.1 RecIntMult算法 84
4.1.2 Karatsuba算法 84
4.1.3 比较递归过程 85
4.2 形式声明 86
4.2.1 标准递归过程 86
4.2.2 主方法的陈述和讨论 87
4.3 6个例子 88
4.3.1 重温MergeSort 89
4.3.2 二分搜索 89
4.3.3 整数乘法的递归算法 90
4.3.4 Karatsuba乘法 90
4.3.5 矩阵乘法 91
4.3.6 一个虚构的递归过程 92
4.3.7 小测验4.2~4.3的答案 93
*4.4 主方法的证明 94
4.4.1 前言 94
4.4.2 重温递归树 95
4.4.3 单层所完成的工作 96
4.4.4 各层累计 97
4.4.5 正义与邪恶:需要考虑3种情况 98
4.4.6 预告运行时间上界 99
4.4.7 最后的计算:第一种情况 100
4.4.8 迂回之旅:几何级数 101
4.4.9 最后的计算:第二种情况和第三种情况 102
4.4.10 小测验4.4~4.5的答案 103
4.5 本章要点 103
4.6 习题 104
第5章 快速排序(QuickSort) 107
5.1 概述 107
5.1.1 排序 108
5.1.2 根据基准元素进行划分 108
5.1.3 高级描述 110
5.1.4 内容前瞻 110
5.2 围绕基准元素进行划分 111
5.2.1 简易方法 111
5.2.2 原地实现:高级计划 112
5.2.3 例子 113
5.2.4 Partition子程序的伪码 115
5.2.5 QuickSort的伪码 117
5.3 良好的基准元素的重要性 117
5.3.1 ChoosePivot的简单实现 118
5.3.2 ChoosePivot的过度实现 118
5.3.3 小测验5.1~5.2的答案 119
5.4 随机化的QuickSort 121
5.4.1 ChoosePivot的随机化实现 121
5.4.2 随机化QuickSort的运行时间 122
5.4.3 直觉:随机基准元素为什么很好 123
*5.5 随机化QuickSort的分析 124
5.5.1 预备工作 125
5.5.2 分解蓝图 126
5.5.3 应用蓝图 128
5.5.4 计算比较的概率 130
5.5.5 最后的计算 132
5.5.6 小测验5.3的答案 133
*5.6 排序需要 (n log n)的比较 134
5.6.1 基于比较的排序算法 134
5.6.2 具有更强前提的更快速排序 135
5.6.3 定理5.5的证明 136
5.7 本章要点 138
5.8 习题 139
挑战题 140
编程题 141
第6章 线性时间级的选择 142
6.1 RSelect算法 143
6.1.1 选择问题 143
6.1.2 简化为排序 144
6.1.3 分治法 145
6.1.4 RSelect的伪码 146
6.1.5 RSelect的运行时间 147
6.1.6 小测验6.1~6.2的答案 149
*6.2 RSelect的分析 150
6.2.1 根据阶段追踪进展 150
6.2.2 简化为掷硬币 151
6.2.3 综合结论 153
*6.3 DSelect算法 154
6.3.1 基本思路:中位的中位元素 154
6.3.2 DSelect的伪码 155
6.3.3 理解DSelect 156
6.3.4 DSelect的运行时间 157
*6.4 DSelect的分析 159
6.4.1 递归调用之外所完成的工作 159
6.4.2 一个粗略的递归过程 159
6.4.3 30-70辅助结论 160
6.4.4 解析递归过程 163
6.4.5 先猜后验方法 164
6.5 本章要点 166
6.6 本章习题 166
挑战题 167
编程题 168
附录A 快速回顾数学归纳法 169
附录B 快速回顾离散概率 173
趣学算法
作者:陈小玉
扫描二维码,一键购买
“笨办法”学Python 3
作者:[美] 泽德 A. 肖(Zed A. Shaw)
扫描二维码,一键购买
数据结构(Python语言描述)
作者:【美】Kenneth A. Lambert(兰伯特)
扫描二维码,一键购买
Python核心编程(第3版)
作者:【美】Wesley Chun(卫斯理 春)
扫描二维码,一键购买
Python编程从入门到精通
作者:叶维忠
扫描二维码,一键购买
Python编程无师自通
作者:[美] 科里•奥尔索夫
扫描二维码,一键购买
点击“阅读原文”购买《算法详解:卷1 算法基础》
阅读原文