前 言
不论学习、工作还是生活中,算法无处不在,只是出场方式和表现形式不同,甚至很
多时候都感觉不到算法的存在。但在大数据和人工智能时代,我们会越来越发现,算法比
我们更懂这个世界,甚至可以说是这个世界的主宰。
算法是武林高手的内功,是程序的灵魂,编程语言则是手中的刀剑。精妙的招式固然
重要,但没有深厚的内功作为支撑也只是花拳绣腿,在绝对的实力面前一切技巧都是浮云。
具备深厚的内功之后,再有一把得心应手的兵器则是锦上添花。程序员水平的高低,最终
还是看其算法功底以及对所用语言和系统底层知识的理解。一个人往下钻得越深,基础越
扎实,他的上升空间越大。
深入分析问题、重新表述问题和重新表示数据并在一定程度上简化问题,是一项非常
重要的能力,描述问题和表示数据的方式对于算法设计与优化非常重要,好的数据结构和
表示方法可以起到化繁为简的作用。如果不能使用简单易懂的方式描述和解释一个算法,
很可能是描述者本人并没有真正理解算法,甚至没有真正理解问题本身。
当我们编写程序成功解决问题之后,不应该满足于此,功能正确只是最低要求。还应
该从算法设计、数据类型选择、数据结构设计、语言底层运行机制等方面进行全方位优化,
让程序更快、更好、更优雅,发挥精益求精、迎难而上的工匠精神,同时也训练自己的抽
象思维、逻辑思维、计算思维,毕竟算法设计和优化是非常灵活又充满智慧的过程。另外,
很多算法在问题规模较小时表现很好,但问题规模变大时算法性能就会急剧恶化,这也是
我们不断优化算法和设计新算法的重要原因和主要目的之一。
虽然算法推导和证明对于理解、改进和优化旧算法以及设计新算法也很重要,但限于
篇幅,本书并没有把重点放在此处,甚至个别算法的原理也没有展开详细解释,更多的是
算法的实现、优化和应用。尽管如此,作者仍然强烈建议有能力的读者阅读更多扩展资料
理解算法原理以及证明过程,这样更有助于进一步优化和设计算法。
有人可能会说,既然选择使用Python语言,内置类型、内置函数、标准库、扩展库
已经封装和实现了大量的算法,并且现在计算机内存和CPU性能也比前些年高了成百上
千倍,我们自己还有必要在算法上花费这么多精力吗?非要硬抠细节的话,干脆改回去用
C语言算了。这样想是不对的。不管使用什么语言,良好的算法功底对程序员来说都是非
常重要的。尽管Python已经提供了强大的计算生态,越来越符合低代码开发的要求,但
并没有覆盖人类全部的需求,仍有很多核心功能和外围功能需要我们自己编写代码来实现,
良好的算法设计与优化意识会促使我们去探索底层工作原理和高级用法。Python本身有
些操作会引入一些隐形的开销,其中有些开销是可以避免的,这需要非常熟悉Python底
层运行机制。虽然CPU性能和各种硬件配置已经有了翻天覆地的变化,但仍不能满足大数
据时代信息爆炸式增长和人工智能时代对算力的需求,该节省还是要节省。由于Python
内置对象、标准库对象以及扩展库对象提供了非常强大的功能,很多人已经慢慢习惯了调
用现成的模块,自己经常动手实现一些算法不仅可以防止变懒变傻,还可以防止过度依赖
别人尤其是防止被国外“卡脖子”。
书中很多算法的实现和优化利用了Python语言特有的语法和数据结构,不一定适
用于其他编程语言。尽管真正的算法应该是超脱和凌驾于具体的编程语言之上的,但借
助于编程语言提供的功能快速实现算法如虎添翼,何乐而不为呢?并且,既然选择使用
Python语言,充分发挥和利用这门语言的优势也是程序员的义务和优秀品质之一。
可能你听到过很多人抱怨说Python虽然是门很好的编程语言但实在是太慢了,可能
你也是这么认为的,但通过学习本书你应该会改变这个看法。一个好的程序不仅需要好的
算法,还需要对代码本身进行反复优化,充分利用Python提供的功能,同时还要避免一
些会拖慢程序的坑。即使你不专门从事算法设计和分析行业,也会从本书中介绍的一些思
路和Python语言知识中受益。
授人以鱼不如授人以渔,很多人懂这个道理,但却忽略了一个重要前提,那就是传授
的“渔”必须是经过反复验证有效的,传授者已经使用这样的方法捕到了足够多的鱼,而
不是纸上谈兵的空洞理论和不切实际的想法。只见过几次猪跑就大谈猪肉味道的做法更是
不可取的,这是在教学过程中特别需要注意的问题。另外,作为建议,应尽量编写优雅、
高效、可读性强的代码,不做“防御性编程”(加引号是因为这里不是指原本的意思),故
意把代码写得难以阅读和维护来避免自己被辞退,虽然确实有人这样做。踏踏实实做事,
坚信单位是公正的,或者说会越来越公正的,至少我们都希望是这样也朝这个方向去努力。
每个领域都有大量的算法,仅仅计算机相关领域的算法也不是一本教材能覆盖的,同
一个算法又在不同的领域有不同的应用。但限于篇幅,也限于作者熟悉的领域,不可能在
一本书中包含全部,只能精挑细选了很小的一部分来讲解和实现,希望能起到抛砖引玉的
作用。任何算法都有局限性和适用范围,没有放之四海而皆准的通用算法,如果问题不符
合特定条件或者不具备特定性质,相应的算法也就不适用了。另外,很少有问题是只使用
一种算法就可以解决的,大部分问题的求解都是同时使用了多个算法的思想或结构。书中
有些案例仅使用了一种算法,更多案例则使用多种不同算法进行求解,有些算法的思想在
多个案例中都有体现,有些案例又可以使用不同的算法来解决,有些案例还同时综合使用
了多种算法。本书在组织内容时大体以算法类型和案例所属领域来安排章节,但并不严格,
仍存在不同章节内容交叉的情况。很多案例和算法之间是互相交织和关联的,你中有我,
我中有你。除第1章外,本书其他章节之间没有严格的先后关系,但也不是并列关系,有
的章节是算法思想,有的章节是算法结构,有的章节是算法应用,教学或自学时可以随意
安排顺序。尽管如此,仍建议在时间允许的前提下从前向后按章节顺序学习。
本书假设读者已有Python基础,这样阅读和理解代码时会轻松很多。如果需要系
统学习Python基础知识和其他领域的应用,请参考作者编著的其他教材或者微信公众号
“Python小屋”阅读技术文章。
本书适合作为计算机类专业的算法课程教材,也可以作为算法工程师与爱好者的自学
教材或算法竞赛选手的参考资料。用书教师可以在清华大学出版社官方网站下载配套资源,
也可以通过微信公众号联系作者获取。为便于Python零基础的读者学习,可扫描本页二
维码快速入门Python语言。
由于水平有限和时间仓促,书中难免出现错误,欢迎各界同行和广大师生交流反馈。
董付国
2025年2月
