前言
为什么要写这本书
本书是讲解算法的教材。为帮助大家理解,书中使用了大量的代码和图表。
学习算法不是一件容易的事情,再加上复杂的场景和数学理论,会让算法的学习曲线更陡。因此,本书尽量使用通俗易懂的语言描述。同时,我们选择了Python这门简单易懂的语言作为本书的编程语言。对于初学编程的人来说,Python可以缩短学习编程语言的时间和降低学习编程的难度,使得初学者可以更加关注算法本身的魅力,而不是拘泥于复杂的语法结构。
随着编程学习的深入,大家自然会发现算法才是编程的核心,这也是为什么像Google、Facebook、阿里巴巴等这类大公司在面试中主要会考查算法的原因。并且,很多算法的智慧都可以应用到人们的生活中去,因此,算法的知识不仅对计算机专业的人有用,大家都应有所了解。
算法离不开数据结构,为此,本书选取了几大经典算法和数据结构进行讲解。而算法和数据结构的学习也能充分锻炼读者的编程和解决问题能力。
本书有何特色
1.涵盖核心算法知识点
本书涵盖排序算法、查找、双指针问题、哈希算法、深度优先搜索算法、广度优先搜索算法、回溯算法、动态规划、贪心算法、分治算法、并查集、最短路径算法和数论算法共13个常见算法,帮助读者全面掌握核心算法的知识点。
2.以Python语言为载体,降低学习难度
抛弃其他复杂的编程语言,本书采用简单的编程语言Python作为算法的载体,降低学习算法的难度。
3.选择经典算法的经典问题,有较高的通用性
本书在简单介绍算法基础以后,选择了13个经典算法,重点讲解算法原理,并选择丰富、经典问题进行有针对性的练习和讲解。
4.提供完善的技术支持和售后服务
由于笔者水平有限,时间仓促,书中难免存在疏漏和不足之处,敬请读者批评指正。欢迎发送邮件至邮箱:317977682@qq.com。读者在阅读本书的过程中有任何疑问,都可以通过该邮箱获得帮助。
本书内容及知识体系
第1章 算法初步
本章详细介绍了算法的本质、意义和应用。在了解算法本质的同时,要掌握时间复杂度和空间复杂度,以判断一个算法的效率和实用性。时间复杂度和空间复杂度是衡量一个算法优劣的标尺。
第2章 排序算法
本章讲解了8种常用排序算法,重点在于理解各个排序算法的核心思想,并把它们应用到其他算法中。
第3章 查找
本章讲解了顺序查找、二分查找及树中的查找这三大类查找方法,其中详细讲解了二叉搜索树的操作以及AVL树的平衡方法,并给出了部分示例程序。合理地使用二分查找、二叉搜索树和平衡树,可以使查找效率大大提高。
第4章 双指针问题
“指针”是编程语言中的一个对象,它存储着一个内存空间的地址,计算机可以通过这个地址找到变量的值。也就是说,这个特定的地址指向这个特定的值。指针最大的优点在于它可以有效利用零碎的内存空间。双指针问题通过两个指针辅助求解。
第5章 哈希算法
哈希算法也是一种查找算法,应该说哈希算法是最快的查找算法。使用哈希算法解决查找问题,不仅效率高、代码少,而且容易理解。读者在遇到查询问题能用哈希算法的时候,一定要记得使用哈希算法。
第6章 深度优先搜索算法
深度优先搜索算法是经典的图论算法,深度优先搜索算法的搜索逻辑和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解。
第7章 广度优先搜索算法
广度优先搜索算法与深度优先搜索算法类似,也是查询的方法之一,它也是从某个状态出发查询可以到达的所有状态。但不同于深度优先搜索算法,广度优先搜索算法总是先去查询距离初始状态最近的状态,而不是一直向最深处查询结果。
第8章 回溯算法
回溯算法和“暴力”线性搜索法的相似点在于两者在最坏的情况下都会尝试所有的可能,导致时间复杂度为指数级别。与“暴力”线性搜索法相比,回溯算法是一种有条理的、最优化的搜索技术。回溯算法会通过提前放弃一些已知不可能的选择,加快速度。
第9章 动态规划
动态规划是一种算法设计技术,通常用于求解最优化问题。它和分治算法很类似,都是通过划分并求解子问题来获得原问题的解。但与分治算法将子问题递归求解不同,动态规划旨在剔除递归中的重叠子问题,对每个子问题只求解一次,从而可以极大地节省算力资源。
第10章 贪心算法
算法求解虽比一般的递归求解资源消耗小,但是我们通常还是要将每个子问题都求解出来。对于很多最优化问题而言,我们还能不能简化呢?答案当然是肯定的,这就需要使用贪心算法。
第11章 分治算法
分治算法的主要思想是将原问题分成若干个子问题,解决这些子问题再最终合并出原问题的答案。在计算过程中,子问题会被递归地分解成更小的子问题,直到子问题满足边界条件。最后,算法会层层递归回原问题的答案。
第12章 并查集
并查集是解决图的遍历问题的一种优化数据结构,在元素的划分和查找问题中,可以有效降低解决问题时的时间复杂度。
第13章 最短路径算法
从手机导航到人工智能,最短路径问题在人们生活中无处不在。在之前介绍了关于图的基本知识,包括权重、路径、有向图及无向图。这一章则介绍四个解决最短路径问题的算法。
第14章 数论算法
本章详细介绍了欧几里得算法、扩展欧几里得算法、中国余数定理以及两个素性检验算法:费马素性检验与米勒-拉宾素性检验。数论中的算法在计算机领域可能不像排列或查找那么常见,但是它们在密码学中十分重要。另外,除米勒-拉宾素性检验,这些算法都历史悠久,希望读者在学习的同时也感受一下古人的智慧。
适合阅读本书的读者
● 需要全面学习算法的人员。
● 对编程算法感兴趣的人员。
● 希望提高算法水平的程序员。
● 开设相关课程的大专院校师生。