前言
PREFACE
为什么要写这本书
随着大数据处理、人工智能等领域飞速的发展和计算机性能飞跃性的提升,无论在学术界还是产业界,计算机领域的前沿概念与技术都逐步深入到思维层面,数学在这其中发挥的作用越来越重要,越来越多的高深数学理论被用到实际中来,有效地解决了许多实际问题,例如分析几何、小波分析、数值计算等。这一切让人们逐步意识到计算机程序设计依赖的就是数学知识和算法思想。在软件工程师动手编程完成某一任务之前,先要通过一系列的过程来确定解决该任务的方法。首先,分析待求解任务/问题,将其抽象为某种数学模型;然后确定求解该问题时的资源限制(包括时间资源、电力资源、存储资源、计算资源、容错成本等);最后在已知信息的基础上,选择已有的算法或提出新的算法,在满足资源限制的情况下解决问题。因此,可以说一个不懂算法的“菜鸟”程序员是无法独立、自主地解决具体工程问题的,也很难写出逻辑严密、简化的高质量代码。
一名优秀的计算机科学领域的工程师或科学家一定对经典算法思想有深入的理解并能够将这些算法灵活应用于解决实际问题的过程中。目前,很多顶尖IT公司都会考察应聘者的算法功底和逻辑思维能力,因为算法功底深厚的应聘者,往往可以使项目的设计模式格外优化,程序逻辑也非常严密清晰。IT公司的顶尖专家和“达人”都对算法有很深的造诣,而项目经理也必须具备超强的逻辑思维能力。
对于所有即将迈入职场的计算机科学相关领域的学生而言,应该都希望以后在职场中逐渐成长为自身所在细分领域的优秀人才,具备出色完成各类任务、解决各类问题的能力,算法可以说是解决这些问题的关键,而程序只是一件外衣。算法的功底与一个计算机科学工程师的水平上限关系密切。所以,如果你想从事计算机科学相关工作,那么就认真地培养自己的逻辑思维,从而提高算法功底吧!
本书由郭晶晶、刘志全、楚秦等编著,刘玖墫、田思怡、李海洋、熊良成参与了本书的编校与审稿工作,其中刘玖樽和田思怡负责完成本书配套视频的讲解工作。所有相关作者以及团队均在计算机科学领域有着多年的算法学习经历和IT领域工作经验,对算法有着较为深入的开发与实践。本书是在所有作者(包括未出现在作者名单中的幕后奉献者)钻研算法的基础上,加之长期的应用总结而完成的,并用言简意赅的语言将这些算法问题的答案展现出来。
本书特色
当前,市面上的算法书籍不计其数,从经典的《算法导论》到针对具体的细分领域(例如文本处理、神经网络等)相关算法的书籍,每一本都有自己的侧重点与特色。本书的特色主要体现在以下几方面:
1)强调算法基础,理论与应用并重。
2)包含大量实际应用中的算法真题。
3)本书以C/C++语言实现。
读者对象
1)计算机领域程序员及工程师。
2)计算机科学相关领域本科生及硕士研究生。
3)其他算法爱好者(对算法感兴趣的高中生、产品经理等)。
我们的目标是将本书作为广大IT从业者和程序开发人员学习和提升算法能力的高效学习材料,同时可以作为科研院所及企业的工程师参考的一本技术性书籍,不论你是“菜鸟”还是“达人”,阅读本书都将受益匪浅,提升解决实际编程问题的能力。
本书内容
本书共16章内容,总体可以分为以下四大部分。
第一部分(算法基础,第1、2章)
这一部分将引导读者理清算法在计算机系统中的作用以及伪代码的约定等,不仅给出了算法的定义,简单地介绍了算法的表达方式,同时引导读者思考算法的设计和分析问题,本书后面的内容都是建立在这些基础之上的。
第1章 算法综述:阐述了算法在计算机领域的定义、地位及作用,让读者对算法有一个简单、初步的认识。此外,还给出了本书中伪代码写法的约定。
第2章 算法分析:详细讨论了如何分析一个算法的时间与空间复杂度,令读者清楚衡量一个算法好坏的标准。
第二部分(经典算法思想,第3~7章)
算法设计有很多思想,但是归纳起来,算法设计中有五种思想使用最为广泛,它们分别是分治法、动态规划算法、贪心算法、回溯法与分支界限法。这一部分逐一介绍了这些经典算法思想的具体思路以及利用这些算法思想可以解决的具体问题。
第3章 递归与分治:详细介绍了递归与分治的思想以及它们的应用,此外还给出了近年来的算法真题。
第4章 动态规划算法:动态规划(Dynamic Programming,DP)是求解决策过程(Decision Process)最优化的数学方法。本章详细介绍了动态规划的思想以及可以应用这种思想解决的一些经典问题,此外还给出了近年来的算法真题。
第5章 贪心算法:这一章介绍了另一种解最优化问题的思路——贪心算法。主要介绍了贪心算法的基本思想以及可以应用这种思想解决的一些经典问题,此外还给出了近年来与此相关的算法真题。
第6章 回溯法:这一章介绍了一种适用于面对大规模处理对象时的选优搜索思想——回溯法。主要内容包括了回溯法的具体思想、实现框架和具体的应用,以及近年来的算法真题。
第7章 分支界限法:这一章介绍了回溯法之外的另一种通过搜索问题的解空间树来寻找问题解的算法——分支界限法,详细介绍了分支界限法的基本概念与算法框架,同时通过几个典型的问题来给出利用分支界限法解具体问题的方法,以及近年来的算法真题。
第三部分(重要数据结构,第8~13章)
谈到算法的时候,数据结构这个词大概率也不会缺席。数据结构也是所有计算机专业学生必修的一门课程。这一部分主要讲解了一些重要数据结构的相关知识以及应用范围。如果数据结构基础足够好的读者,可以跳过本部分,并不会影响阅读本书其余章节。
第8章 栈与队列:这一章主要介绍了栈和队列这两种线性数据结构的具体结构以及主要操作,同时通过例题阐述它们在解决实际问题时的应用,并给出近年来的算法真题。
第9章 链表:这一章介绍了另外一种线性数据结构——链表。详细介绍了链表的具体实现方式以及主要操作,同时也通过例题阐述其在解决实际问题时的应用,并给出近年来的算法真题。
第10章 树与二叉树:这一章详细介绍了树的结构及相关术语,重点介绍了常用的树结构:二叉树以及森林。
第11章 散列表:这一章主要介绍了一种基于散列函数使得记录的存储地址和它的关键码之间建立一个确定的对应关系的数据结构——散列表。主要阐述散列表的基本概念及构造思路。
第12章 并查集:这一章介绍了一种分离集合操作的抽象数据类型——并查集。它是一种常被考察的抽象数据结构。这一章重点介绍了并查集的基本概念、具体实现方法以及实际应用。
第13章 位图:这一章介绍了一种逻辑上很巧妙的描述集合的方法——位图。用位图对集合进行描述后,可以很方便地进行集合的运算,如交、并、差和补集,适用于涉及大规模数据(海量数据),但数据状态又不是很多的问题的求解。这一章将介绍位图的概念、运算方法以及具体的应用。
第四部分(常用算法,第14~16章)
这一部分重点介绍了日常学习或工作中最常用的一些算法,包括常用的排序算法、查找算法以及字符串匹配算法。这些算法并不复杂,但是都有着非常高的使用频率,掌握它们将快速提升读者算法应用和实践能力。
第14章 排序算法:排序问题一直是计算机技术研究的重要问题,有关排序算法的种类非常多也非常巧妙,其中快速排序算法很早就被列为20世纪十大算法之一,可见排序算法的重要性。本章详细分析了常见的各种排序算法,并从时间复杂度、空间复杂度、适用情况等多个方面对它们进行综合比较,并给出近年来的算法真题。仔细研读这些排序算法,也可以体会到算法设计的某些重要原则和技巧。
第15章 查找算法:在计算机应用中,查找是最常用的运算之一。典型的查找算法有顺序查找、折半查找、分块查找、二叉排序树查找、散列表查找等。这一章逐一介绍了这些算法的具体思路。
第16章 字符串匹配算法:这一章介绍了常见的字符串匹配算法,包括简单字符串匹配、KMP算法、BM算法以及SUNDAY算法,并给出近年来的算法真题。
反馈沟通
欢迎读者朋友在阅读本书过程中给予反馈意见,以利于本书的进一步完善与提升。反馈意见请发送至yuancoder@foxmail.com,我们将尽力解决问题。
本书全体作者