﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-杰 &amp; C++-随笔分类-算法/ICPC</title><link>http://www.cppblog.com/jaysoon/category/17357.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Jul 2011 16:22:12 GMT</lastBuildDate><pubDate>Wed, 20 Jul 2011 16:22:12 GMT</pubDate><ttl>60</ttl><item><title>算法的态度</title><link>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html</link><dc:creator>jaysoon</dc:creator><author>jaysoon</author><pubDate>Wed, 20 Jul 2011 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html</guid><wfw:comment>http://www.cppblog.com/jaysoon/comments/151515.html</wfw:comment><comments>http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jaysoon/comments/commentRss/151515.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jaysoon/services/trackbacks/151515.html</trackback:ping><description><![CDATA[<p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">很多同学和朋友经常向我抱怨说，算法已经成为他们学习和工作中的一个负担。在他们看来，算法只能应付一下考试，在学习中没有任何用处；也有人说，求职过程中考算法纯粹是浪费精力，在实际工作中没有用到任何算法。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在我的本科四年中，花了大量时间学习算法，参加算法比赛&#8212;&#8212;成绩很滥，朋友们都说，和我的付出严重不成比例，但是我一点也不后悔花费时间学习算法。算法让我在平时的学习中应对各个科目都从容自如，学习起来事半功倍。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在平时的学习交流中，有时看其他人的代码相当别扭，不是看不懂（有时真看不懂），而是很纳闷，为什么要这么写呢，明明有很明显的顺畅的思路，干吗要写这么绕呢？我将我觉得正确的思路写出来的时候，对方也会觉得这样写顺畅了很多，代码也小了很多。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在一般应用中，不会说让你写一个</span><span style="font-size: 14pt;">KMP</span><span style="font-family: 宋体; font-size: 14pt;">算法，或者给你设计一个动态规划的题目让你来解。但是如果你会这些算法，掌握了这种优化的思想，在平时的编写中会不知不觉的写出比较高效的代码。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">有人说，现在中国的软件现状就是这样，不在乎你实现的有多快，只会在乎你有没有实现所有的功能点，随着硬件条件的改善，一般情况下都能满足要求。这样说也是没错，如果你甘愿只做一名码工，因为对于相当大的一部分软件，效率并不是最重要的，甚至第二、第三重要都排不上。但是对于企业级的应用和软件的核心部分，往往效率是非常重要的。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">如果将编程和写作类比的话，可以进行这个的比较。编程必须会语言</span><span style="font-size: 14pt;">C/C++</span><span style="font-family: 宋体; font-size: 14pt;">、</span><span style="font-size: 14pt;">Java</span><span style="font-family: 宋体; font-size: 14pt;">、</span><span style="font-size: 14pt;">Python</span><span style="font-family: 宋体; font-size: 14pt;">等，写作也一定要会一个语言汉语、英语、法语，当然计算机语言有效率的优劣以及适合的应用的场景，而自然语言没有这种属性。算法修养之于编程就像文学修养之于创作，没有一定的文学修养就写不出好的作品，同样没有良好的算法修养也创造不出好的代码。数据结构就像写作中的排比句等，它们是骨架，结构化编程就像是写作中的段落，它们使得层次分明。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">在静静的夜晚，明月透过窗子，照进小屋，顿时一种异样的情怀涌上心头。这时有下面几种人，第一种，嚎啕大哭，&#8220;妈妈&#8230;&#8230;&#8221;；第二种，潸然泪下，&#8220;我嚓，想家了是不&#8221;；第三种，沉思状，&#8220;有首诗可以表达这个情怀&#8221;，拿起全唐诗，查找了整晚，夜尽天明时，惊呼&#8220;找到了，原来是&#8216;举头望明月，底头思故乡&#8217;啊，我记得有的。&#8221;；第四种，徘徊低吟&#8220;举头望明月，底头思故乡&#8221;；第五种，心中油然而生，&#8220;独在异乡为异客，明月千里寄乡思&#8221;。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">同样地，这也反映了一个程序员算法修养的几种境界。第一种，菜鸟，不会表达自己的思想，这种多见于初学语言的人，只会写</span><span style="font-size: 14pt;">hello world</span><span style="font-family: 宋体; font-size: 14pt;">之类程序的人；第二种，入门，可以表达出自己的想法，但是不懂什么算法，只是凭自己对计算机语言的理解写程序，当然写出的程序功能点可能不少，但是不完善，潜在的</span><span style="font-size: 14pt;">bug</span><span style="font-family: 宋体; font-size: 14pt;">很多；第三种，有一定的算法基础，但是没有掌握完全，写程序时有高效的意识，对一些核心程序，看着资料也能写出相应的代码，但是不能活学活用；第四种，有不错的算法修养，写出的代码清晰高效，可胜任关键代码的编写；第五种，有很高的算法修养，理解了算法的精髓，自己可以得出算法供世人学习，一般是大师级人物。国内有相当一部分程序员就是处于第二阶段，他们也有稳定的工作，甚至不错的收入，但是总感觉遇到了瓶颈，自己的能力踌躇不前。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">有人说，现在各种库都有，那些代码都非常高效，我只要熟练使用这些库就行了，不用学习算法。可以达到熟练使用几个库的程序员也算是第三阶段，但是要想熟练驾驭更多的库，将库函数熟练的使用，没有一定的算法基础是不行的。比如，如果你想熟练使用</span><span style="font-size: 14pt;">STL</span><span style="font-family: 宋体; font-size: 14pt;">库，那么对各种容器和算法都应该有一定的认识，什么时候使用</span><span style="font-size: 14pt;">list</span><span style="font-family: 宋体; font-size: 14pt;">，为什么快排不能应用于</span><span style="font-size: 14pt;">list</span><span style="font-family: 宋体; font-size: 14pt;">？要想回答这些问题，必须掌握初步的算法。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">对于想要在技术上有一定作为的程序员，没有算法修养，就如同金庸小说中的学武之人不学习内功，它可以将外功学的炉火纯清，凭着这份功力可以走遍半个江湖，但是一旦遇到高手就挂了；反之如果有内功修为，学习外功可学一知十，触类旁通，内功修为越高将来的成就越大。</span></p>  <p style="text-indent:24.0pt;line-height:150%"><span style="font-family: 宋体; font-size: 14pt;">学习算法吧！</span></p><img src ="http://www.cppblog.com/jaysoon/aggbug/151515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jaysoon/" target="_blank">jaysoon</a> 2011-07-20 23:59 <a href="http://www.cppblog.com/jaysoon/archive/2011/07/20/151515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>