近年来,算法行业非常火爆,越来越多的人在学习算法。目前,计算机的最重要领域之一是人工智能,而人工智能的核心是算法,算法已渗透到互联网、商业、金融业、航空、军事等各个领域,正在改变着这个世界。
在IT领域,数据结构与算法的应用无处不在。数据结构与算法是计算机开发人员的基本功,很多面试都要考查数据结构与算法。学习数据结构与算法不仅可以培养我们的算法思维,提高我们分析问题、解决问题的能力,还可以让我们快速学习新技术,以更高的视角看待问题。
数据结构与算法教材一般晦涩难懂。为了让更多的人轻松学习算法、爱上算法,笔者写作了《趣学数据结构》《趣学算法》两本书。笔者发现,读者特别喜欢搭配了大量图解的通俗易懂的讲解方式。很多读者也在呼吁笔者写一本结合算法竞赛实例进行讲解的书。经过近两年的筹备,《算法训练营:海量图解+竞赛刷题(入门篇)》和《算法训练营:海量图解+竞赛刷题(进阶篇)》两本书终于要和大家见面了,非常感谢各位读者的大力支持。
算法学习的过程,实际上是通过大量实例,充分体会遇到问题时该如何分析:采用什么数据结构,使用什么算法策略,算法的复杂性如何,是否有优化的可能,等等。这里有以下几个建议。
◇ 第1个建议:学经典,多理解。
算法书有很多,初学者最好选择图解较多的入门书,当然,也可以选择多本书,从多个角度进行对比和学习。先看书中的图解,理解各种经典问题的求解方法,如果还不明白,则可以看视频讲解,理解之后再看代码,尝试自己动手上机运行。如有必要,则可以将算法的求解过程通过图解方式展示出来,以加深对算法的理解。
◇ 第2个建议:看题解,多总结。
在掌握书中的经典算法之后,可以在刷题网站进行专项练习,比如贪心算法、分治算法、动态规划、网络流等。算法比数据结构更加灵活,对同一道题目可以采用不同的算法解决,算法复杂性也不同。如果想不到答案,则可以看题解,比较自己的想法与题解的差距。要多总结题目类型及最优解法,然后找相似的题目并自己动手解决问题。
◇ 第3个建议:举一反三,灵活运用。
通过专项刷题,见多识广,总结常用的算法模板,熟练应用套路,举一反三、灵活运用,逐步提升刷题速度,力争“bug free”(无缺陷)。
刷题的过程就是熟练应用数据结构与算法的过程。在刷题过程中,要学会分析问题、解决问题的方法,总结常用的算法模板和套路,快速写出代码,通过锻炼达到“bug free”。可以集中时间进行系统性专项刷题,不可三天打鱼、两天晒网,也不可随机刷题。题不在多,在于精。通过看书掌握一种数据结构与算法之后,便可找该知识相关的简单题目试手,从易到难。刷题时,可以先在编译系统中编译通过,等测试用例通过且检查无误后再提交,因为在比赛中多次提交会被罚时。刷题网站有很多,算法竞赛刷题网站有Vjudge、POJ、HDU、Code Forces、洛谷等,找工作刷题网站有LeetCode。提交结果类型如下。
· AC(Accepted):通过。
· WA(Wrong Answer):答案错误。
· TLE(Time Limit Exceed):超时。
· OLE(Output Limit Exceed):超过输出限制。
· MLE(Memory Limit Exceed):超出内存。
· RE(Runtime Error):运行时错误。
· PE(Presentation Error):格式错误。
· CE(Compile Error):无法编译。
测试用例通过而提交不通过是很正常的,因为在测试用例中仅有一两组数据,而在后台有大量测试数据。遇到提交不通过的情况时,要首先根据提示判断错误类型,根据错误类型分析原因;然后冷静分析算法逻辑、易错点、特殊情况判断等,看看选择的数据结构和算法是否合适,是否存在死循环。在刷题过程中会发现很多“坑”,一定要记录下来,避免下次“踩坑”。
看题目时要看数据规模、时间限制和空间限制,看看设计的算法是否会超时超限,做到心中有数。如果限制时间为1s,则问题规模( n )和算法时间复杂度之间的关系如下。
· n ≤11: O ( n !)。
· n ≤25: O (2 n )。
· n ≤5000: O ( n 2 )。
· n ≤10 6 : O ( n log n )。
· n ≤10 7 : O ( n )。
· n >10 8 : O (log n )。
本书具有以下特色。
(1)完美图解,通俗易懂。本书对每个算法的基本操作都有图解演示,通过图解,许多问题都变得简单,可迎刃而解。
(2)实例丰富,简单有趣。本书结合大量竞赛实例,讲解如何利用数据结构与算法解决实际问题,使复杂难懂的问题变得简单有趣,帮助读者轻松掌握算法知识,体会其中的妙处。
(3)深入浅出,透析本质。本书透过问题看本质,重点讲解如何分析和解决问题。本书采用了简洁易懂的代码,对数据结构设计和算法的描述全面细致,而且有算法复杂性分析及优化过程。
(4)实战演练,循序渐进。本书在对每个数据结构与算法讲解清楚后,都进行了实战演练,使读者在实战中体会数据结构与算法的设计和操作,从而提高独立思考、动手实践的能力。书中有丰富的练习题和竞赛题,可帮助读者及时检验知识掌握情况,为从小问题出发,逐步解决大型复杂性工程问题奠定基础。
(5)网络资源,技术支持。本书为读者提供书中所有范例程序的源代码、竞赛题及答案解析,读者对这些源代码可以自由修改编译,以符合自己的需要。本书提供博客、微信群、QQ群技术支持,可随时为读者答疑解惑。
写书是极其琐碎、繁重的工作,尽管笔者已经尽力使本书的内容和网络支持接近完美,但仍然可能存在很多漏洞和瑕疵。欢迎读者提供关于本书的反馈意见,因为对本书的评论和建议都有利于我们改进和提高,以帮助更多的读者。如果对本书有什么评论和建议,或者有问题需要帮助,则可以致信rainchxy@126.com与笔者交流,笔者将不胜感激。
读者资源请参照本书封底提示。
感谢笔者的家人和朋友在本书写作过程中提供的大力支持。感谢电子工业出版社工作严谨、高效的张国霞编辑促成本书的早日出版。感谢提供宝贵意见的同事们。感谢提供技术支持的同学们。感恩遇到这么多良师益友!