zoukankan      html  css  js  c++  java
  • 深入学习算法的一点拙见

    今天实在是头脑不听使唤了,没力气看书,写代码了。写点总结吧。 都说算法是内功,究竟练到什么程度才算修成了呢? 为什么要学习,强化算法? 首先强调的是,下面的原因均是建立在算法熟练到一定程度后的效果。不熟的话,未见得能达到效果。这些原因很现实。但很多程序员却不知道或不以为然。
    1. 比较世俗的方面,顶级软件公司笔试,面试会问到。别说你不想去谷歌,百度,微软,如果真的没想过,我希望你能想想自己是否具备进入的实力。如果还是没兴趣想,那就忘了这条,看看下面的原因吧。
    2. 如果算法熟练,能显著提高看代码的速度,越是工作久了,越会发现很多时候是在读别人写的代码,然后在其基础上追加功能,或修改bug。所以这是很现实的技能。
    3. 算法操练上手快,注意只是快,但不见得容易。因为练习省去了界面等操作,只利用编译器最基本的功能,非常适合初学者,编程环境不十分熟练的人来学习,别小看这一点,这能让你不论在家,在同学的电脑上,甚至在网吧,只要你想操练都是能迅速找到办法写程序实现的。
    4. 难学,有区分度,正因为难,属于内功级别的学习,不是工具型的学习,所以她经久不衰,这项技能能让你不论什么时候都能作为一个亮点技能展示,并运用。比如眼下学python的人不少,但如果再出现更进步,高效的语言,而且这是完全有可能的,又需要重新学习,那什么才是被各种纷繁语言覆盖的,能让你拥有后在短时间能适应任何语言层面的转换工作,更为通用的技能呢?无疑,数据结构+算法是其中一个,而且是非常重要的一项技能。而更为重要的是,算法这种技能,最实实在在的在于他的优势持久性,周围的人如果没有经过大量算法编码训练,只是看过书写过简单算法的人是很难短期内超越你的。也就是说,这项技能越高越能保证你的能力、水平在社会上具有唯一性。即:稀缺人才。
    1. 很多简单的UI操作,短期培训班出来的照着做也能做出来很炫的效果,要佩服微软的封装工作,把UI设计大大简化了。
    2. 对编程语言的基本功能会得到大量强化,比如操作符重载,数组,指针的运用,类的构建,对字符串的操作,以及STL,泛型的理解、运用。这里我想你应该看到了学习算法的过程是如何与计算机应用建立起了联系,因为你肯定在写程序时无数次与这些内容打交道,当然,不深入学习算法,也同样可以获得这些知识,而且.NET,Java,已经封装了非常多的这类基础操作,使得字符串处理变得容易多了。这就要看你的风格,需求了。这里我只是介绍深入学习算法能带来的好处,至于不深入学习有没有坏处,我不做评价。注意"深入"二字的修饰作用,如果没学过基本的数据结构,甚至数组、链表都没搞懂区别的话,那做程序员一定是不行的。迟早会遇到瓶颈,而且很快。
    3. 提供了足够的可扩展空间。对计算机科学的深层研究必备武器,比如操作系统,搜索引擎,编译器等等。要分析linux源代码,会发现,操作系统在内存管理,进程,线程管理,文件管理,协议栈中,运用了大量算法实现,如果基本算法都不理解,甚至不知道,很难说分析源代码能有多深入。因为看不懂啊。这时会有种遇到瓶颈的感觉。类似玩劲乐团的人,玩到一定程度,眼睛能跟上,但手速跟不上了。
    4. 注意,算法虽然是内功,但不是全部,还有很多知识是非常重要的,值得学习的,跟算法关系不太大的。比如设计模式,面向对象思想。所以算法学习到什么程度,自己酌情处理。毕竟越深入,会发现数学知识可能遇到瓶颈,但我想大多数人,只要不是搞科学研究,是不必深入到写龙格-库塔,FFT等算法的地步的。
    5. 总之深入学习算法的目的,对于程序员来说,是为了提高编程效率,提高解决问题的效率,能达到需要算法时,自己实现或找来能用的算法,很容易的嵌入到自己的程序中即可。
    说说自己的学习,和强化路线吧,考虑到自己年事已高(28),相比之下算法,数据结构基础未见得比少数玩ACM的大一(18)学生强。 自信一点!如果真的多数大一学生比我强,那确实没法混了,转行的时候到了。呵呵。 当然不能妄自菲薄,要相信自己有这个学习能力,有这个潜质。相信自己的数学基础足够用,这点要感谢中国对中小学数学教育普及的深啊, 况且我也一直是数学方面的优等生。同时自己的编码,学习经验也将是事半功倍的最大帮助。 对内存的分析,编译器的使用,代码的细节,操作系统的运作原理等知识的理解都要好于大一学生。 虽然意识有点晚,但我看好这项技能,并希望拥有她,而且相信我可以通过努力实现目标。 先定目标: 1 通过练习算法,提高分析问题,利用计算机解决问题的能力。 2 提高读代码,发现问题的能力。 3 提高对C++,C#等语言的运用能力,如STL的应用。C++各种语法细节的理解。 方法:练习+看书+做题+实战。 1. 练习常用数据结构,算法的实现,如,链表,队列,二叉树,排序,图等。以及下面说的第一阶段内容。     要求代码实现,用C,C++,C#均可,还要能用STL实现。总之,越熟越好。能盲打最高境界了。到这个程度,算法内功对我来说,应付各种工作都足够用了。 2. 不断重新看数据结构,算法的讲解,从中更深刻的理解每种算法的核心思想。 3. 练习常用算法,看书,很容易过度训练,然后恶心。一个容易激发热情的方式是做题,ACM,topcoder等平台,都有良好的积分评级政策。还有就是笔试题。这个只在处于找工作期间有很大动力。    没看到ACM题库中又多了一个绿色的对号,自己的blog又多了些人来访问,等级提高都会有一种潜在的成就感,荣誉感萌发。这些虚拟的等级就是源动力。 4. 写总结,1,2,3如果都不能激发你的潜在兴趣了,实在编恶心了,那就把感受,辛酸苦辣,收获写出来与大伙分享吧。同时也是对自己的过去进行回忆,发现自己的进步之处。     不断给自己找出新的理由去继续学习。最重要的,这也是一个知识储备,构建自己的knowledge base的过程。对你未来的工作绝对是最宝贵,熟悉的财富。     比如,万一你将来够牛了,想出书了,这些一点一滴的积累过程将是再好不过的素材了。 量化目标: 我一向认为能将质变效果量化了是一种很好的创新方式。因为他提供了一条完成的路。而且符合现代人,现代社会的价值观。 功成名就,无可厚非,这是一个大好的结果,如果办到,是千万老百姓都在寻找的答案。可惜每个成功人事的路都无法得到复制。 新东方老师曾问在做的学生,想GRE取得高分,拿奖学金么? 当然想。 答案:熟背2万英语单词,得2万美刀,背的过程中去想1个单词就是1刀,全部完成后才能兑现。 这个例子在我印象中很多年,一直是我认为将质变量化的最为典型,贴切的例子。 理想,梦想,高薪,富足生活,都可以看作一种质变,而努力奋斗的生活就是量化的过程。不同的是有人提前知道路在哪里,有人走着走着才知道。 有人虽然知道路,但怕黑怕孤独不愿走,有人坚持下去了,走到了最后;有人走着走着发现走错路了,有人走着走着庆幸的发现走对路了。 很难说,哪条路好走,哪条路是对的, 相比之下我更倾向于能看到结果的路,这可能就是老人说的,要有个奔头吧。 1 TopCoder上250的题目(包括读题),曾有个人说20分钟能搞定去Google不成问题。我试过些,包括读题还是比较有难度,所以现实点吧:30分钟内搞定。 2 做完500 ACM题目。 3 如果能做到1,2相信算法能力已经有小小质变了。再加个基础要求吧,对于常用算法能40分钟内在纸上完成代码。 另外转一个网上的评述:
    一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的, 主要时间是花在思考算法上,不是花在写程序与debug上。 下面给个计划你练练: 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘、判线段相交、然后写个凸包. 6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简) 7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式. 8. 调用系统的qsort, 技巧很多,慢慢掌握。 9. 任意进制间的转换 第二阶段:练习复杂一点,但也较常用的算法。 如: 1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。 5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6. 博弈类算法。博弈树,二进制法等。 7. 最大团,最大独立集。 8. 判断点在多边形内。 9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.
    时间: 人都是总结,展望容易,靠想靠说当然容易些,尤其是技术人员。真的去做,去完成却是最难的。所以上面说了一大堆,真正最后能实现多少,都是未知数。定些计划,往往能激发自己去完成,如果再把这个计划公开,那就更能加上点督促的力量。2-3年吧,是个比较合理的估计,那时工作也快满5年了。应该有一定积累了,也是质变的时候了。
  • 相关阅读:
    个人中心标签页导航(2017.12.13)
    评论列表显示及排序,个人中心显示(2017.12.12)
    20199329 2019-2020-2 《网络攻防实践》 综合实践
    20199329 2019-2020-2 《网络攻防实践》第十二周作业
    20199329 2019-2020-2 《网络攻防实践》第十一周作业
    20199329 2019-2020-2 《网络攻防实践》第十周作业
    20199329 2019-2020-2 《网络攻防实践》第九周作业
    20199329 2019-2020-2 《网络攻防实践》第八周作业
    20199329 2019-2020-2 《网络攻防实践》第七周作业
    20199329 2019-2020-2 《网络攻防实践》第六周作业
  • 原文地址:https://www.cnblogs.com/benhuan/p/3302042.html
Copyright © 2011-2022 走看看