怎样系统地学习算法( 四 )


但是,如果在现实中遇到一个复杂问题,一个芯片只能完成其中一个功能,难道要连接十几块芯片来解决这一个问题?
你在搞圣诞树嘛?一个树枝挂个小礼物,叮叮当当的乱响。这显然是不合适的,我们需要的是完成该复杂问题的一个芯片,因此需要运用所学的数据结构知识,高效处理具有复杂关系的数据。
通过学习数据结构,更加准确、深刻地理解不同数据结构之间的共性和联系,学会选择和改进数据结构,高效地设计并实现各种算法,这才是数据结构的精髓。
03数据结构的学习秘籍▲会数据结构的基本操作
这是最基础的要求,学会各种数据结构的基本操作,取值、查找、插入、删除等。先看图解,理解各种数据结构的定义,操作方法,然后看代码,尝试自己动手上机运行,逐渐掌握基本操作。
初学时,要想理解数据结构,一定要学会画图,通过画图形象表达,更能体会其中的数据结构关系。因此,初学阶段学习利器:画图,理解,画图。
▲会利用数据结构,解决实际问题
在掌握了书上的基本操作之后,就可以尝试利用数据结构解决一些实际问题了,先学经典应用问题的解决方法,体会数据结构的使用方法,然后再做题,独立设计数据结构解决问题。
要想熟练应用就必须做大量的题,从做题中体会其中的方法。最好进行专项练习,比如线性表问题,二叉树问题,图问题,该阶段学习利器:做题,反思,做题。
▲熟练使用和改进数据结构,优化算法
这是最高境界了,也是学习数据结构的精髓所在,单独学习数据结构是无法达到这种境界的。它需要在学习算法的过程中慢慢修炼。
在学习算法的同时,逐步熟练应用、改进,慢慢体会不同数据结构和算法策略的算法复杂性,最终学会利用数据结构改进和优化算法。
该阶段已经在数据结构之上,通过在测试系统上刷各种算法题,体会利用数据结构改进优化算法。该阶段学习利器:刷题,总结,刷题。
刷题网站
打比赛:HDU、POJ、Vjudge、CodeForces找工作:LeetCode


04算法为什么那么难?再来谈谈学习算法。
很多人感叹:算法为什么那么难!首先,算法本身具有一定的复杂性,但还有一个原因:讲的太烂!算法的教与学有两个困难:
▲我们学习了那些经典的算法,在惊叹它们奇思妙想的同时,难免疑虑重重:这么牛,怎么想到的?对学生来说,这可能是最费解、也最让人窝火的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。
但这对菜鸟来说,简直比登天还难,很可能花费很多时间也无法搞清楚。这条路对大多数人来说,是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?看似学会了,其实两手空空。遇到一个新问题,仍然无从下手。
可这偏偏又是极重要的,无论做研究还是实际工作,一个计算机专业人士最重要的能力,就是解决问题——解决那些不断从实际应用中冒出来的新问题。
▲算法作为一门学问,有两条几乎平行的线索。
一个是数据结构(数据对象):数、矩阵、集合、串、排列、图、表达式、分布等等。
另一个是算法策略:贪心、分治、动态规划、线性规划、搜索等等。
这两条线索是相互独立的:同一个数据对象上有不同的问题,例如单源最短路径和最优二叉树,就可以用到不同的算法策略,如贪心和动态规划;而同一个算法策略,例如排序和整数乘法,也会用到不同的数据结构。它们之间是多对多的关系。



两条线索交织在一起,该如何表述?
我们早已习惯《数据结构》中讲数据结构,《算法设计与分析》里面讲算法策略。各说各的,讲算法设计时就假设你已经对数据结构了如指掌,还没有哪一本算法书很好的解决这两个困难,传统的算法书,大多注重内容的收录,但却忽视思维过程的展示,因此我们学习了经典的算法,却费解于算法设计的过程。
遇到一个实际问题,通过问题分析,选择使用什么样的算法策略,基于这种算法策略选择什么样的数据结构,有时算法策略和数据结构的选择并不是唯一的,不同的算法策略和数据结构设计的算法,其复杂性是不同的。
而很多书就是灌输式的讲一个实例,一下子就选择了一个认定是最优的算法策略,告诉你就这样干,不谈数据结构,然后分析算法复杂性,就结束了。
原则上讲算法策略就讲算法策略,不依赖任何程序设计语言和数据结构,但对很多学生来讲,尤其是语言没学好,数据结构也不熟练的同学,只讲算法策略,如同空中楼阁。自己用算法解决实际问题,一头雾水。
这也是我为什么要写《趣学算法》这本书,来弥补目前学习资料的缺陷。这本书的讲解是从问题出发,根据实际问题进行分析,选择合适的算法策略,并分析为什么采用这种算法策略,然后选择什么数据结构,不同的数据结构复杂性会有什么区别,巧妙地将数据结构和算法策略拧成了一条线。
通过大量实例,充分展现算法设计的思维过程,让学生充分体会遇到一个问题,如何分析,使用什么算法策略,采用什么数据结构,算法的复杂性如何?是否有优化的可能?
05算法学习秘籍知识在于积累,学习需要耐力。学习就像挖金矿,或许一开始毫无头绪,一头雾水,但转个角度,换换工具,时间久了总会找到一个缝隙。成功就是你比别人多走了一段路,或许恰恰是那么一小步。
第一个建议:多角度,对比学习学习算法,可以先阅读一本简单的入门书,然后综合几本书横向多角度看,例如学习动态规划,拿几本算法书,把动态规划这章找出来,比较学习,多角度对比分析更清晰,或许你会恍然大悟,噢,原来如此简单。
或许有同学说我哪有那么多钱买那么多书,只要你想学习,没有什么可以阻挡!你可以图书馆借,也可以联系你的老师,每学期上课前,我都会告诉学生,如果你想学习却没钱买书,我可以提供帮助。想一想,你真的没有办法?



第二个建议:大视野,不求甚解经常有学生为了一个公式推导,或几句代码抛锚,甚至停滞数日,然后淹没在无尽的挫败感中,把自己弄得垂头丧气。公式可以不懂,代码可以不会。你不必投入大量精力试图推导书上的每一个公式,也不必探究语法或技术细节。
学算法就是学算法本身,首先是算法思想,解题思路,然后是算法实现,算法思想的背后可能有高深的数学模型,复杂的公式推导,你理解了当然玄妙,不懂就拉倒。
算法实现可以用任何语言,所以不必纠结是C,C++,Java,Python,更不必管严格的语法规则,除非你要上机调试。
建议还是先领会算法,写伪代码,在大脑中调试吧,如果没有良好的编程经验,一开始就上机或许更让你崩溃。遇到不懂的部分,浏览一下或跳过去,读完了还不明白再翻翻别的书,
【怎样系统地学习算法】总有一天,你会发现,“蓦然回首,那人却在灯火阑珊处”。
第三个建议:多交流,见贤思齐与同学,朋友,教师或其他编程爱好者们一起学习和讨论问题,是取得进步最有效的办法,也是分享知识和快乐的途径。
加入论坛,加入交流群,会了解其它人在做什么,怎么做,遇到问题可以请教高手,带来醍醐灌顶的喜悦;也可以应助菜鸟,使你暗自得意,信心倍增。论坛和群也会分享大量的学习资料和视频,还有不定期的培训讲座,读书交流会,你会发现,你不是一个人在战斗!



第四个建议:勤实战,越挫越勇实践是检验一切真理的标准。古人云:“学以致用”,“师夷长技以制夷”。请不要急切期盼“实际的”例子,更不要看不起小实例,“不积跬步,无以至千里”。
大规模的成功商业案例所采用的算法,人工情感,无人驾驶,不是我们目前要解决的问题。
看清楚脚下的路,比仰望天空更实际,多做一些实战练习,更好地体会算法的本质,在错误中不断成长,越挫越勇,终究会成参天大树。
06如何打开算法和数据结构这两扇门?推荐两本入门书:《趣学算法》\u0026amp;《趣学数据结构》



《趣学算法》,作者:陈小玉六大推荐理由:▲实例丰富,通俗易懂。从有趣的故事引入算法,从简单到复杂,使读者从实例中体会算法设计思想。实例讲解通俗易懂,让读者获得最大程度的启发,锻炼分析问题和解决问题的能力。▲完美图解,简单有趣。结合大量完美绘图,对算法进行分解剖析,使复杂难懂的问题变得简单有趣,给读者带来巨大的阅读乐趣,使读者在阅读中不知不觉地学到算法知识,体会算法的本质。▲深入浅出,透析本质。采用伪代码描述算法,既简洁易懂,又能抓住本质,算法思想描述及注释使代码更加通俗易懂。对算法设计初衷和算法复杂性的分析全面细致,既有逐步得出结论的推导过程,又有直观的绘图展示。▲实战演练,循序渐进。每一个算法讲解清楚后,进行实战演练,使读者在实战中体会算法,增强自信,从而提高读者独立思考和动手实践的能力。丰富的练习题和思考题用于及时检验读者对所学知识掌的握情况,为读者从小问题出发到逐步解决大型复杂性问题奠定了基础。▲算法解析,优化拓展。每一个实例都进行了详细的算法解析,分析算法的时间复杂度和空间复杂度,并对其优化拓展进一步讨论,提出了改进算法,并进行伪码讲解和实战演练,最后分析优化算法的复杂度进行对比。使读者在学习算法的基础上更上一个阶梯,对算法优化有更清晰的认识。▲网络资源,技术支持。网络提供本书所有范例程序的源代码、练习题以及答案解析,这些源代码可以自由修改编译,以符合读者的需要。本书提供源代码执行、调试说明书,对读者存在的问题提供技术支持。


《趣学数据结构》,作者:陈小玉三大推荐理由:▲完美图解+丰富实例,复杂问题简单化为基本操作配以图解,用数据结构解决生活中的实际问题,学习过程更加轻松有趣。▲原理分析+实战演练,真正地学以致用通俗化讲解基础知识,在实战中体会数据结构的设计和操作,锻炼独立思考的能力。▲配套代码+在线答疑,为学习保驾护航提供书中的范例程序源代码、练习题以及答案解析,并在博客和QQ群中答疑解惑。以上。
内容来源:异步图书,有删改。========?
点赞、收藏、关注@人民邮电出版社一键三连,感恩有你~

■不BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了4年!!!
为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。




这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
如果觉得不错,别忘了双击点个赞哦。
貌似手机端打开连接有的会出现问题,可以点击这个总结看看:
五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法1、复杂度分析看动画轻松理解时间复杂度(一)
看动画轻松理解时间复杂度(二)
冰与火之歌:「时间」与「空间」复杂度
每个程序员都应该收藏的算法复杂度速查表
2、基本算法思想五分钟了解一下什么是「贪心算法」
有了四步解题法模板,再也不害怕动态规划!
(进阶版)有了四步解题法模板,再也不害怕动态规划!
(再进阶版)有了四步解题法模板,再也不害怕动态规划!
浅谈什么是分治算法
看动画轻松理解「递归」与「动态规划」
浅谈什么是动态规划以及相关的「股票」算法题
深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法「多图警告」手撕排序算法–iOS进阶必备
十大经典排序算法动画与解析,看我就够了!(配代码完全版)
这或许是东半球分析十大排序算法最好的一篇文章
4、搜索几道和「广度优先搜索」有关的算法面试题
初识广度优先搜索与解题套路
从简单二叉树问题重新来看深度优先搜索