内容简介
《算法与数学:数学思维与编程实践》深入探讨算法与数学的密切关系,旨在帮助读者通过数学思维提升编程能力。
《算法与数学:数学思维与编程实践》系统梳理算法学习所需的数学基础,全面介绍二分查找、素数判定法、欧几里得算法、蒙特卡罗方法、排序算法、动态规划法、埃拉托斯特尼筛法、图论算法等**算法,将典型数学分析归纳为9个要点进行讲解。书后配有30道综合测试题,可帮助读者检验和复习所学知识。
精彩书摘
第1章算法与数学的密切关系
1.1什么是算法
1.2为什么算法离不开数学
1.3本书的构成及学习方法
1.4本书涉及的算法
1.5本书涉及的数学知识和数学思考
1.1什么是算法
算法,简单来说就是“解决问题的步骤”。虽然听起来可能有些抽象甚至复杂,但实际上,它与我们的日常生活息息相关。举个例子,计算从1加到100的总和,这看似简单的问题背后,其实就蕴含着算法的思维。
1.1.1算法1:一个一个加
*简单的做法如下图所示:1+2=3,3+3=6,6+4=10 以此类推,逐个相加。这种方法只需要重复小学三年级难度的加法运算,就能得到一个正确的结果。你可以尝试不用计算器来计算一下,这个过程需要进行99次加法运算,即使是擅长计算的人,也至少需要5分钟才能完成。
1.1.2厂算法2:将算式变形再计算
接下来,让我们思考另一种算法(或者说计算步骤)。我们可以将1到100的数字两两一组,分解为50组,每组的和都是101,例如“1和100”“2和
99”“3和98” “50和51”。这样一来,答案就显而易见了:101x50=5050。如果用连等式来表示,可以写成:
1+2+3+4+ +100
=(1+100)+(2+99)+(3+98)+(4+97)+ +(50+51)
=101+101+101+101+ +101=101x50=5050
与算法1中需要99次加法运算相比,这种方法仅需一次“101x50”的乘法运算,因此可以说它是一种更为高效的算法。
1.1.3厂解决各种现实问题的算法
上面这个例子只是简单的计算问题,算法的应用范畴远不止于此。事实上,它可以用来解决生活中的各种复杂问题,例如:
求东京站到新大阪站的*短路径(4.5节)。
快速计算一定时间内游乐园的总到场人数(4.2节)。
把期末考试的结果按成绩排序(3.6节)。
寻求用*少张数的纸币支付货款的方法(5.9节)。
寻求尽可能多地看电影的方法(5.9节)。
用词典查“technology”的意思(2.4节)。
特别是*后一个“查词典”的例子,它正是我们日常生活中常见的场景。如果从词典的**页开始,逐个单词查找:a—aardvark—aback—abacus—
abalone—abandon—.那么要找到“technology”这个词可能需要几十分钟。为了提高效率,我们可以采用“猜测目标词的大致位置,然后逐步缩小查找范围”的方法。这种方法不仅节省时间,还能显著提升查找的效率。
1.1.4厂算法的改进很重要
解决社会问题离不开算法,但并非所有算法都适用。正如本节开头的“算法1”所示,如果算法效率低下,处理大规模数据时将会耗费大量时间。
现代计算机的计算速度远超人类,但其能力也并非无限。例如,一台标准的家用台式机每秒大约只能进行10亿次计算(具体数值取决于计时方法和运算类型)。你可能会认为,如此快的计算速度足以让任何算法瞬间完成运算,但现实却并非如此。
计算次数的“爆炸”
下面是一个需要大量计算次数的例子:我们采用一种朴素的算法,尝试枚举所有商品的选择方案。
我们将在2.4节详细阐述该算法的实现细节,此处无须深人探讨。不过可以明确的是,每增加一个商品,选择商品的方案数便会翻倍。当商品数量达到60个时,选择方法将达到1.15x1018种。如此庞大的数量使得完全枚举所有方案变得极其困难。
算法的改进很重要
这类问题往往极易突破计算机运算能力的极限。因此,我们亟需对算法进行优化,力求以更少的计算量获得相同的结果。
事实上,现实世界中的诸多问题都是通过巧妙运用**算法得以高效解决的,这也凸显了系统学习**算法的重要性。
为什么算法离不开数学
1.1节阐述了算法及其重要性。然而,学习算法不仅需要掌握相关的数学知识,还需具备敏锐的数学洞察力。本节将从三个方面阐述数学在算法学习中的关键作用。
1.2.1,算法的理解与数学
数学是理解算法本质的基础。以“高精度计算圆周率Z这一**问题为例:在一个边长为1cm的正方形区域内随机散布若干点,统计落在以左下角为圆心、半径为1cm的四分之一圆内的点的比例,将该比例乘以4即可得到n的近似值。
如下图所示,当随机散布20个点时,若有16个点落在圆内,则可计算出,这一结果已相当接近真实值。
为何如此简单的算法能够得出接近真实值的结果?要深人理解其背后的原理,就必须掌握统计学这一数学分支的基础知识。这一规律同样适用于本书所涉及的其他算法:例如,动态规划(3.7节)建立在“数列递推关系”的数学基础之上,而广度优先搜索(4.5节)则源于“图论”的数学理论。
1.2.2厂算法的性能评估与数学
数学在评估算法性能方面至关重要,特别是“计算次数”或“时间复杂度”的概念
目录
目录
第1章 算法与数学的密切关系
1.1 什么是算法 2
1.2 为什么算法离不开数学 5
1.3 本书的构成及学习方法 7
1.4 本书涉及的算法 11
1.5 本书涉及的数学知识和数学思考 12
第2章 算法中的数学基础知识
2.1 数字的分类、代数表达式、二进制 14
节末习题 22
2.2 基本运算和符号 23
节末习题 30
2.3 各种函数 31
节末习题 39
2.4 估算计算次数(枚举和二分查找) 41
节末习题 53
2.5 其他基本数学知识 55
节末习题 63
专栏1 关于算法竞赛 64
专栏2 组合型枚举 67
总结 70
第3章 基本算法
3.1 素数判定法 72
节末习题 76
3.2 欧几里得算法 77
节末习题 83
3.3 组合数与算法 84
节末习题 90
3.4 概率、期望值与算法 92
节末习题 97
3.5 蒙特卡罗方法(统计学思维) 99
节末习题 105
3.6 排序和递归思想 106
节末习题 119
3.7 动态规划法(利用递推公式) 121
节末习题 133
专栏 3 数组的二分查找 135
总结 137
第4章 高级算法专栏
4.1 用计算机解决图形问题(计算几何学) 140
节末习题 146
4.2 差分与前缀和 148
节末习题 152
4.3 牛顿迭代法(尝试数值计算) 154
节末习题 161
4.4 埃拉托斯特尼筛法 162
节末习题 169
4.5 图论算法 171
节末习题 187
4.6 高效的取模运算 189
节末习题 200
4.7 矩阵的幂(斐波那契数列的快速计算) 201
节末习题 206
专栏 4 三角函数 208
专栏 5 梯度下降法 210
总结 212
第5章 为解决问题而进行的数学分析
5.1 为什么数学分析很重要 214
5.2 考虑规律性 217
节末习题 221
5.3 着眼于奇偶性 222
节末习题 225
5.4 巧妙地处理集合 226
节末习题 231
5.5 考虑极限情况 232
节末习题 235
5.6 分治法 236
节末习题 239
5.7 计数贡献法 240
节末习题 248
5.8 考虑上限 249
节末习题 253
5.9 只考虑下一步(贪心算法) 254
节末习题 258
5.10 其他数学思考方法 259
节末习题 269
专栏 6A*算法 271
总结 272
综合测试题 273
**图书 281
参考文献 282
跋 283
试读
第1章算法与数学的密切关系
1.1什么是算法
1.2为什么算法离不开数学
1.3本书的构成及学习方法
1.4本书涉及的算法
1.5本书涉及的数学知识和数学思考
1.1什么是算法
算法,简单来说就是“解决问题的步骤”。虽然听起来可能有些抽象甚至复杂,但实际上,它与我们的日常生活息息相关。举个例子,计算从1加到100的总和,这看似简单的问题背后,其实就蕴含着算法的思维。
1.1.1算法1:一个一个加
*简单的做法如下图所示:1+2=3,3+3=6,6+4=10 以此类推,逐个相加。这种方法只需要重复小学三年级难度的加法运算,就能得到一个正确的结果。你可以尝试不用计算器来计算一下,这个过程需要进行99次加法运算,即使是擅长计算的人,也至少需要5分钟才能完成。
1.1.2厂算法2:将算式变形再计算
接下来,让我们思考另一种算法(或者说计算步骤)。我们可以将1到100的数字两两一组,分解为50组,每组的和都是101,例如“1和100”“2和
99”“3和98” “50和51”。这样一来,答案就显而易见了:101x50=5050。如果用连等式来表示,可以写成:
1+2+3+4+ +100
=(1+100)+(2+99)+(3+98)+(4+97)+ +(50+51)
=101+101+101+101+ +101=101x50=5050
与算法1中需要99次加法运算相比,这种方法仅需一次“101x50”的乘法运算,因此可以说它是一种更为高效的算法。
1.1.3厂解决各种现实问题的算法
上面这个例子只是简单的计算问题,算法的应用范畴远不止于此。事实上,它可以用来解决生活中的各种复杂问题,例如:
求东京站到新大阪站的*短路径(4.5节)。
快速计算一定时间内游乐园的总到场人数(4.2节)。
把期末考试的结果按成绩排序(3.6节)。
寻求用*少张数的纸币支付货款的方法(5.9节)。
寻求尽可能多地看电影的方法(5.9节)。
用词典查“technology”的意思(2.4节)。
特别是*后一个“查词典”的例子,它正是我们日常生活中常见的场景。如果从词典的**页开始,逐个单词查找:a—aardvark—aback—abacus—
abalone—abandon—.那么要找到“technology”这个词可能需要几十分钟。为了提高效率,我们可以采用“猜测目标词的大致位置,然后逐步缩小查找范围”的方法。这种方法不仅节省时间,还能显著提升查找的效率。
1.1.4厂算法的改进很重要
解决社会问题离不开算法,但并非所有算法都适用。正如本节开头的“算法1”所示,如果算法效率低下,处理大规模数据时将会耗费大量时间。
现代计算机的计算速度远超人类,但其能力也并非无限。例如,一台标准的家用台式机每秒大约只能进行10亿次计算(具体数值取决于计时方法和运算类型)。你可能会认为,如此快的计算速度足以让任何算法瞬间完成运算,但现实却并非如此。
计算次数的“爆炸”
下面是一个需要大量计算次数的例子:我们采用一种朴素的算法,尝试枚举所有商品的选择方案。
我们将在2.4节详细阐述该算法的实现细节,此处无须深人探讨。不过可以明确的是,每增加一个商品,选择商品的方案数便会翻倍。当商品数量达到60个时,选择方法将达到1.15x1018种。如此庞大的数量使得完全枚举所有方案变得极其困难。
算法的改进很重要
这类问题往往极易突破计算机运算能力的极限。因此,我们亟需对算法进行优化,力求以更少的计算量获得相同的结果。
事实上,现实世界中的诸多问题都是通过巧妙运用**算法得以高效解决的,这也凸显了系统学习**算法的重要性。
为什么算法离不开数学
1.1节阐述了算法及其重要性。然而,学习算法不仅需要掌握相关的数学知识,还需具备敏锐的数学洞察力。本节将从三个方面阐述数学在算法学习中的关键作用。
1.2.1,算法的理解与数学
数学是理解算法本质的基础。以“高精度计算圆周率Z这一**问题为例:在一个边长为1cm的正方形区域内随机散布若干点,统计落在以左下角为圆心、半径为1cm的四分之一圆内的点的比例,将该比例乘以4即可得到n的近似值。
如下图所示,当随机散布20个点时,若有16个点落在圆内,则可计算出,这一结果已相当接近真实值。
为何如此简单的算法能够得出接近真实值的结果?要深人理解其背后的原理,就必须掌握统计学这一数学分支的基础知识。这一规律同样适用于本书所涉及的其他算法:例如,动态规划(3.7节)建立在“数列递推关系”的数学基础之上,而广度优先搜索(4.5节)则源于“图论”的数学理论。
1.2.2厂算法的性能评估与数学
数学在评估算法性能方面至关重要,特别是“计算次数”或“时间复杂度”的概念