
前言
这个技术有什么前途
随着计算机编程人员的不断增多,公司面试要求也越来越高,而算法无疑是面试官最喜欢考察的内容之一,学会算法是面试者或程序员应具备的基本能力;在面试的过程中,面试官通常也会考查面试者的编程能力。现在最流行的编程语言无疑是Python,本书不仅帮助初学者掌握算法,而且通过Python语言进行实战演练,让读者在理解算法的同时掌握Python,提升读者的综合竞争力。
笔者的使用体会
笔者也是从学生时代一路走来的,深知算法对编程者的重要性,也知道对于一名普通的初学者来说,算法入门多么不容易。算法并不神秘,算法就在我们身边,我们的吃喝住行样样离不开算法,我们吃的饭菜的烹饪顺序,喝的饮料的配方,房子里使用的扫地机器人的扫地路径,开车规划的最短路线等,都充斥着大量美妙的算法。算法种类繁多,给人“乱花渐欲迷人眼”的感觉,让很多初学者望而却步。其实算法本质上是有规律可循的,掌握这些规律,就会有一种“初极狭,才通人,复行数十步,豁然开朗”的感觉。笔者愿意把自己对算法的理解和掌握的规律分享给读者,希望读者通过本书能对算法也有一种“豁然开朗”的感觉,真正体会到算法的美妙。
本书的特色
本书描述的都是算法中的一些经典问题、经典解法,读者在学习的时候往往会惊叹这些算法设计得巧妙,会思考这些算法是怎么被想到的。其实这些算法都经过了严格的数学证明,但是证明过程对于初学者来说很难理解,如果深挖下去,不但会花费很多时间,而且还会把自己绕进去。本书从实际出发,省略掉令人乏味的数学证明,通过形象生动的图解演示整个算法过程,目的是让读者形象地了解算法的整个运行过程,加深记忆。再遇到类似问题,读者可以像求解数学题一样,触类旁通,用已经掌握的经典算法解决遇到的新问题。求解问题流程如下图所示。

求解问题流程
本书不仅描述算法的流程,而且还配以大量的Python实战演练,因为算法的设计和实现不应该被分割。有些面试者在面试的时候,可以将算法的原理讲得头头是道,但是一旦面试官让其将算法通过程序实现出来,就会出现无法下笔或者实现出来的程序和自己设计的算法不一致的情况。这主要是因为算法从设计到实现还需要一个大量训练的过程,如果只是训练算法的设计而忽略了算法的实现,那么对于程序员来说就相当于跛着脚走路,所以我建议初学者在理解算法以后要进行大量的实际编程,在编程中领悟算法。本书基于以上观点,在介绍完算法以后,会配以可执行的程序,通过程序的实际结果来验证算法的正确与否,让读者在理解算法的同时进行实战训练,加深对算法的理解,填补算法设计和算法实现之间的沟壑。
本书主要内容
本书主要讲解了7种常用的算法,分别是贪心算法、分而治之算法、树算法、图算法、动态规划算法、回溯法和分支限界法。
● 贪心算法。“贪心”又名“贪婪”,是求解最优化问题的一种算法,在求解最优问题时,贪心算法是最直观和最容易理解的。事物是具有两面性的,当前的最优并不一定是最终结果的最优,所以贪心算法并不能保证有最佳答案,但是常常可以帮助我们得到接近最佳答案的答案。
● 分而治之算法。顾名思义,先“分”而后“治”,“分”就是将整体划分成部分,“治”就是先求解部分问题,每个部分问题都解决了,整体也就解决了,“天下难事,必作于易;天下大事,必作于细”,只要事物达到了一定的规模,就需要不断地拆分,然后求解。
● 树算法。树结构是一个非常重要的数据结构,树结构在现实生活中随处可见,如家谱、公司组织结构、操作系统的目录等,围绕着树结构也有各种各样的算法,掌握这些算法以后处理树结构问题就可以得心应手。
● 图算法。图结构也是一个非常重要的数据结构,图结构在现实生活中也随处可见,如城市的交通轨道、人际关系、互联网等,围绕着图结构也有各种各样的算法,掌握这些算法以后处理图结构问题也就可以得心应手了。
● 动态规划算法。动态规划算法是比贪心算法更加强大、更通用的求解最优化问题的工具。在用动态规划算法对问题求解时,从整体最优上加以考虑是“目光长远”的,其从最终结果的最优解不断反推前面决策的最优。人们一旦学会了动态规划算法,无疑就掌握了一种求解最优问题的利器。
● 回溯法。通过深度优先搜索对待选解决方案进行系统的检查,在搜索的过程中去除不必要的搜索,极大地减少了程序的整个搜索时间,保证了在有限的时间内找到问题的答案。
● 分支限界法。通过广度优先搜索对待选解决方案进行系统的检查,在搜索的过程中去除不必要的搜索,极大地减少了程序的搜索时间,保证了在有限的时间内找到问题的答案。
本书读者对象
● 算法初学者
● Python程序员及其他编程爱好者
● 各计算机专业的大中专院校学生
● 需要算法入门工具书的人员
● 其他对算法有兴趣的人员