十年磨一剑,这是一本有声音的算法书

简介: 这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。

这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。

YouTube课程图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平台。另外还有一些资源可以帮助读者根据自己的心愿提升对在线课程的体验。

  • 视频。如果你觉得相比阅读文字,更喜欢听和看,那么可以在YouTube的视频播放列表中观看。这些视频涵盖了《算法详解》系列的所有主题。我希望它们能够激发读者学习算法的持续热情。当然,它们并不能完全取代书的作用。
  • 小测验。你怎么才能知道自己是否完全理解了本书所讨论的概念呢?散布于全书的小测验及其答案和详细解释就起到了这个作用。当读者阅读到这块内容时,最好能够停下来认真思考,然后再继续阅读接下来的内容。
  • 章末习题。每章的末尾都有一些相对简单的问题,用于测试读者对该章内容的理解。另外还有一些开放性的、难度更大的挑战题。本书并未包含章末习题的答案,但是读者可以通过本书的论坛(稍后介绍)与我以及其他读者进行交流。
  • 编程题。许多章的最后部分是一个建议的编程项目,其目的是通过创建自己的算法工作程序,来培养读者对算法的完全理解。读者可以在www.algorithmsi- lluminated.org上找到数据集、测试例以及它们的答案。
  • 论坛。在线课程能够取得成功的一个重要原因是它们为参与者提供了互相帮助的机会,读者可以通过论坛讨论课程材料和调试程序。本书系列的读者也有同样的机会,你可以通过www.algorithmsilluminated.org参与互动。

第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 算法基础》

阅读原文

相关文章
|
算法
【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)
【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)
116 0
|
17天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
23天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
3天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
10天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
19天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
10天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
16天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
20天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
14天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
下一篇
DataWorks