算法学习瓶颈
很多人感叹:算法为什么这么难学!
个原因是,算法本身具有一定的复杂性。另一个原因是,讲得不到位!
算法的教与学有两个困难。
(1)我们学习了那些经典的算法,在惊叹它们奇妙的同时,难免疑虑重重:这些算法是怎么被想到的?这可能是最费解的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。但对菜鸟来说,这简直比登天还难,他们很可能花费很多时间也无法搞清楚。对大多数人来说,这条路是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?这样做看似学会了,其实两手空空,遇到新问题时仍无从下 F 。但这扁帰义是为重要的,论是做研究还是故头坏 L 作,计算儿专业人士最重要的能力就是鮮决题﹣解决那些不断从实际应用中冒出来的新问题。
(2)算法作为一门学问,有两条几乎平行的线索。条是数据结构(数据对象):数、矩阵、集合、、非列、餐、表认工 G 、力巾。另余是早法友格贵い绂路、分8绂路、绂格、生格、搜索策略等。这两条线索是相互独立的:对于同个数据对象上不同的问题(如单源最短路径和多源最短路径),就会用到不同的算法策略(如贪心策略和动态规划策略);而对于完全不同的数据对象上的问题(如排予和撃教來云)也许就会用到同 N 算去策略(如分治策路)。
两条线索交织在一起,该如何表述呢?我们早已习惯在一章中完全讲排序,而在另一章中完全讲图论。还没有哪一本算法书能够很好地解决这两个困难,传统的算法书大多注重内容的收录,却忽视思维过程的展示,因此我们虽然学习了经典的算法,却费解于算法设计的过程。
本书从问题出发,根据实际问题分析、设计合适的算法策略,然后在数据结构上操作实现,巧炒地将数舌结沟和算法策略庁成杀线。全书通过大重头例,充分展现法设计的思维过程,让卖者充分体会求鲜题的思路、如何分析、使用什么算法策略、采用什么数据结构、算法的复杂性如何、是否有优化的可能等等。这里,我们培养的是让读者怀着一颗好奇心去思考问题、解决问题,更重要的是﹣体会学习的乐趣,发现算法的美!
经过本文的学习,使我深深的了解到了:
将程序执行次数作为时间复杂度衡量标准。
时间复杂搜桶常用新 r 上界符号 Of ( n )表示。
衡量算法的好坏时通常考查算法的最坏情况。
空间复杂度只计算辅助空间。
递归算法的空间复杂度需要计算递归使用的栈空间。
设计算法时要尽量避免爆炸级增量复杂度。
通过本章的学习,对算法有了初步的认识,算法就在我们的生活中。任何一个算法都不是凭空造出来的,而是来源于现实中的某个问题,由此推及一类、一系列问题,所以算法的本质是高效地解决实际问题。本章中的部分内容或许你还不是很清楚,不必灰心,还记得我在本书第1版的前言中所说的“大视野,不求甚解”吗?例如斐波那契数列的通项公式推导,不懂没关系,只要知道斐波那契数列用递归算法,时间复杂度是指数阶,这就够了。就像面包师一边和面,一边详细讲做好面包要多少面粉、多少酵母、多大火候,如果你对如何做面包非常好奇,大可津津有味地听下去,如果你只是饿了,那么只管吃就好了。
通过算法,你可以与世界顶级大师进行灵魂交流,体会算法的妙处。
Donald Ervin Knuth 说:“程序就是蓝色的诗”。而这首诗的灵魂就是算法,走进算法,你会发现无与伦比的美!