内容提要
本书内容包括算法初步、排序算法、查找、双指针问题、哈希算法、深度优先搜索算法、广度优先搜索算法、回溯算法、动态规划、贪心算法、分治算法、并查集、最短路径算法和数论算法等常见算法。每个算法都做了深入的讲解,同时通过实例介绍了如何应用这些算法。书中算法都以Python语言进行描述。本书的特色在于讲解知……
前言
为什么要写这本书本书是讲解算法的教材。为帮助大家理解,书中使用了大量的代码和图表。学习算法不是一件容易的事情,再加上复杂的场景和数学理论,会让算法的学习曲线更陡。因此,本书尽量使用通俗易懂的语言描述。同时,我们选择了 Python 这门简单易懂的语言作为本书的编程语言。对于初学编程的人来说,Py……
第1章 算法初步
1.1 什么是算法1.1.1 算法的定义对算法的解释,从古至今定义是不唯一的。本书给出的算法的定义是:一系列用来解决单个或多个问题,或有执行计算功能的命令的集合。而联系上输入与输出,算法就是将输入转换为输出的一系列计算步骤的集合。生动地讲,可以把一个程序比作一道菜。如图1-1所示,做菜的原材料就……
第2章 排序算法
排序通常指把毫无规律的数据,按照一种特定的规律,整理成有序排列的状态。一般情况下,排序算法按照关键字的大小,以从小到大或从大到小的顺序将数据排列。排序算法是最基础也是最重要的算法之一,在处理大量数据时,使用一个优秀的排序算法可以节省大量时间和空间。因为不同的排序算法拥有不同的特点,所以我们应根据情……
第3章 查找
查找的定义为:在一个数据元素集合中,通过一定的方法确定与给定关键字相同的数据元素是否存在于集合中。一般来说,如果查找成功,程序会返回数据的位置或相关信息;如果查找失败,则返回相应的提示。查找的方法可以分为两种:比较查找法与计算式查找法。比较查找法基于两种数据结构:线性表和树。查找的对象(一般是由同……
第4章 双指针问题
指针存储着计算机中一个内存空间的地址,它是编程语言中的一个对象。通过它存储的地址,计算机可以找到存储在计算机存储器中另一个地方的变量单元。一个特定的地址指针指向一个特定的变量单元。在重复读取数据的情况下,使用指针可以改善程序性能。同时,指针还可以有效利用存储器中非连续的内存。4.1 单链表链表是……
第5章 哈希算法
哈希算法也是一种查找算法,可以说哈希算法是最快的查找算法。对于查找问题而言,哈希算法一直是首选算法。5.1 哈希算法的原理在日常生活中,信息的重要性不言而喻,我们常常需要使用搜索引擎来解决日常生活中的大量问题,其中的一项关键技术就是数据查找算法。因此,如何提高数据查找的效率是我们不断追求的目标。……
第6章 深度优先搜索算法
深度优先搜索算法是经典的图论算法,深度优先搜索算法的搜索逻辑和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解。同时,本章会介绍图的基本知识和优秀的图算法。6.1 搜索搜索算法里的搜索和平时我们生活里搜索引擎中的搜索不尽相同。前者的意思则是“遍历”,通俗地讲……
第7章 广度优先搜索算法
与第6章深度优先搜索算法相似,广度优先搜索算法也是一个主要解决图问题的搜索算法。通过第6章的学习,我们知道深度优先搜索算法可以应用于二叉树问题,或最大面积的搜索,但一些经典的路径问题,如求解图中的最短路径问题,则需要应用广度优先搜索算法。广度优先搜索算法与深度优先搜索算法类似,也是查询的方法之一,……
第8章 回溯算法
回溯算法可以算作搜索/遍历算法的一个分支。回溯算法和暴力的线性搜索法的相似点在于两者在最坏的情况下都会尝试所有的可能,导致时间复杂度为指数的搜索。但是,比起暴力搜索法,回溯算法是一种有条理的、最优化的搜索技术。回溯算法会通过提前放弃一些已知不可能的选择,从而加快速度。回溯算法适用于解决信息量较大的约……
第9章 动态规划
动态规划是一种算法设计技术,通常用于求解最优化问题。它和分治方法很类似,都是通过划分并求解子问题来获得原问题的解。但与分治方法将子问题递归求解不同,动态规划旨在剔除递归中的重叠子问题,对每个子问题只求解一次,从而可以极大地节省人力资源。本章将介绍有关动态规划的问题。9.1 动态规划介绍动态规划在……
第10章 贪心算法
第9章我们讲解了动态规划。当一个问题具有最优子结构时,可以使用动态规划求解。求解虽比一般的递归求解资源消耗小,但是我们通常还是要将每个子问题都求解出来。很多最优化问题还能不能简化呢?答案当然是肯定的。本章我们将会学习另一种方法——贪心算法。10.1 贪心算法介绍第9章最后的最长递增子序列问题中我……
第11章 分治算法
分治算法的主要思想是将原问题分成若干个子问题,解决这些子问题再最终合并出原问题的答案。在计算过程中,子问题会被递归地分解成更小的子问题,直到子问题满足边界条件。最后,算法会层层递回原问题的答案。11.1 分治算法原理分治算法的原理可以用二叉树表示。如图11-1所示,假设给定的问题不能够被直接解决……
第12章 并查集
并查集是解决图的遍历问题的一种优化数据结构,在元素的划分和查找问题中,可以有效降低解决问题时的时间复杂度。12.1 并查集介绍并查集是一种表示不相交集合的数据结构。并查集由一组彼此之间元素各不相同的集合组成,常用于表示一组不相交元素构成的动态集合。在并查集结构中,每个集合都有一个代表元素,用于……
第13章 最短路径算法
从手机导航到人工智能,最短路径问题(Shortest Path Problems)在我们生活中无处不在。在之前我们介绍了关于图的基本知识,包括权重、路径、有向图及无向图。这一章我们学习4个解决最短路径问题的算法。13.1 戴克斯特拉算法利用戴克斯特拉算法(Dijkstra’s Algorithm……
第14章 数论算法
很多数学算法,尤其是离散数学的算法,在计算机领域中拥有重要的位置。离散数学中包括数论与图论,我们已经在第 13 章了解了一些基本的图论算法,接下来我们学习几个重要的数论算法。14.1 欧几里得算法利用欧几里得算法(Euclidean Algorithm,又称辗转相除法),我们可以得出任何两个自然……