第一个问题我觉得我无法给出完美的答案,这里搞竞赛的牛人蛮多,不妨说说体会。

我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的”有效”可以分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算(如所有­的动态规划)。当然,知道这些跟具体的设计出一个算法至少还有十万八千里,只能说有了这个大体的思路,就可以从这两个角度去审视手头的问题,往往是会有启发意义­的罢了。如何避免不必要的计算?也有很多 rules of thumb 可以遵循,如启发式剪枝里面就要求去设计一个最优下界,而最一般的思路则是使劲瞅瞅问题里面有什么条件是没有利用的,这些条件组合起来可以得出什么性质,也许某­个性质就能够被利用来减掉一大堆计算,至于如何从题目条件推出有价值的性质,有两个办法,一是试错(想到的结论都给写出来,陶哲轩在 Solving Mathematical Problems 里面就提到过这个办法。);另一个方向则是脑袋里揣着想要实现的目的往反方向归约。如何缓存重复计算?简单的动态规划问题如fibonacci数列计算,其重复­计算是非常明显的,计算的过程本身就指明了哪些计算是重复的(An 项的计算是重复的)——当然,正如早前邓同学发的一个题目https://groups.google.com/group/pongba/browse_frm/thread/2ca1f2bda0c8…里面说的,其实fibonacci数列计算里面的线性变换本身也是有重复计算的——后者便是更隐蔽的重复计算了,一个 non-trivial 的动态规划问题往往涉及到非常隐蔽的重复计算,或者更难的是,你遍历组合空间的方式决定了你所能够缓存的重复计算到底有多少,也许某个遍历方式之下就没有办法去­缓存计算。当然,算法的范畴其实是很大的,算法是一个AI-Complete 的问题,所有的 Problem-Solving 过程都可以叫做算法。只是有很多实际当中的算法会掉入以上两类而已。

第二个问题我举一个例子:不像很多牛人在高中和本科就竞赛奖牌一堆,我直到大四的时候还不知道什么是动态规划,因为本科四年我一直只对底层技术感兴趣,最喜欢看 比如 Petzold 的《编码的奥秘》和 Richter 的《.NET 框架程序设计》(事实上这是我看的第一本英文原版书)这类书。研一的时候由于方向是自然语言处理,看的第一篇 paper 是 Rabiner 的 A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition。Paper 的内容倒是完全能够理解,但是理解其实只是第一步,我发现理解了之后很快就忘掉了,这就说明理解得不够深刻。比如里面的 Viterbi 算法,花了时间去理解,但是一转头很快又忘掉了。一年后因为机缘巧合,对算法发生了一段短暂的兴趣,并学习了一些基础的算法,尤其是算法的思想,因为思想是有穷­的,但算法是无穷的,尤其是题目是做不完的。之后一段时间,碰巧又需要翻一翻马可夫模型,搜出吴军的数学之美以及那篇 Paper ,发现 Viterbi 算法其实就是最简单的一类动态规划,由于对于动态规划的理解深刻了很多,所以对于 Viterbi 算法,在脑袋里面记住的不再是什么 Forward Variable/Backward Variable 之类的技术细节,而是它的本质,于是便不再容易忘掉,而即便忘掉,就如庞加莱所说,也可以非常迅速的将算法的细节自行构建出来。

其实我相信这样的例子是数不胜数的,所以我这个只是算一个 Yet Another Example ,由于对我来说比较特殊,所以印象较为深刻。

这个例子是关于”理解”的。有时候算法也会非常有用,如有一次写程序时需要用到 LCS 和 Edit-Distance (这样的机会很少,但遇到了时如果不知道有多项式复杂度的算法就很悲惨了),而做机器学习和数据挖掘的更是少不了一坨坨的算法,如果光是理解别人的做法然后实现­出来,那么对算法的思想的把握有助于理解和记忆;如果需要自己设计算法,那就需要算法基础知识的辅助才行了。绝大多数人应该属于前者。

学习到什么程度?我觉得视人群而定。如果做底层开发、应用开发、系统开发,只要知道一个大概就可以了,知道经典的数据结构和算法没有任何困难,而且反正经典算法­都有现成的库可用。对于有兴趣做一点 research 沾边的事情的人,则需要了解这些算法背后的一般性思路是什么,否则来一个特定的算法你就特定的理解记忆一下,肯定不牢靠,而且浪费大脑资源。对于搞 real deal 的 original research 的那就需要广泛的知识积累了,光知道一般性思路都不够。

另一方面,我觉得学完了经典算法,深刻理解了算法背后的一般性思路之后,如果再进一步去玩题目,做题库。效益却不是很大的,因为刀磨了是要用的,玩题目做题库就­是进一步磨刀而不用(不去解决实际问题,能够产生影响力的,或生产力的问题)。实际上做了一些题目之后就完全没必要进一步做题目了,因为做来做去,拼的基本也就­是谁的知识积累多(套路多),谁的耐心大(肯使劲去磨一道题目);实际上谁也不比谁笨,到最后区别就基本上显露在知识积累和耐心上了。所以接着做,刀也不会磨得­更锋利,更何况大好的时光应该去做点有意义的事情(如果是为了 fun 而做题的,那么有意义的事情同样也可以是 extremely fun),比如我觉得最吸引人也最根本的问题就是人工智能问题(想想看,人脑是世界上迄今为止所知最为复杂的结构,这个结构具备了认识自然界”规律”的能力,具­备了认识”自我”的能力,具备了归纳和演绎推理的能力,类比的能力,具备了难以置信的启发式搜索能力,具备完美的模式识别能力,而根据进化论的观点,这样的结构­居然仅仅是通过变异——筛选得来的,如果真有上帝,那么利用上帝赋予我们的大脑去破解上帝这个顶级牛逼程序员写的程序——人脑的秘密,还有比这更带劲儿的事情吗­?),所以我觉得有那么好的基础的牛人,不去直面真正 fundamental 的 problems ,就可惜了,须知题目是永远做不完的,一个公理系统的定理也是永远推导不完的,永远可以设计出题目来给你做,但是真正的问题其实只有一个。如果穷举不了世界上所­有的问题,至少可以举出那些有趣、有意义的问题。

刘未鹏(pongba)
Blog|C++的罗浮宫
http://blog.csdn.net/pongba

什么是算法,为什么需要学算法,以及算法学到什么程度相关推荐

  1. 大厂不一定要进,算法必须要学!精选算法文章 89 篇

    为什么程序员都需要学算法? 程序员对算法通常怀有复杂情感,算法很重要是共识,但是否每个程序员都必须学算法是主要的分歧点.很多人觉得像人工智能.数据搜索与挖掘这样高薪的工作才用得上算法,觉得算法深不可测 ...

  2. php学数据结构,PHP 程序员学数据结构与算法之《栈》

    介绍 "要成高手,必练此功". 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实 ...

  3. 冒泡排序出现的问题_停课不停学 | 有趣的算法——冒泡排序

    停课不停学 有趣的算法--冒泡排序 01 生活中处处都有算法 每个人每天都会用到一些算法,算法也是人类使用计算机解决问题的技巧之一,但是算法并不是仅仅用于计算机领域中,包括在数学.物理甚至是每天的生活 ...

  4. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  5. 粗题⼈不考你没学过的算法

    Description 粗题⼈症重承诺此题不考你没学过的算法 给你⼀个区间[L,R] 需要选择N个数,这N个数都在这个区间范围内 那么我们知道⼀共有[R-L+1]^N种选法 假如我们想要这N个数的最⼤ ...

  6. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法 (白宁超   2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类 ...

  7. diff算法阮一峰_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法

    前言 文章的一开头,还是要强调下字符串匹配的思路 将模式串和主串进行比较 从前往后比较 从后往前比较 2. 匹配时,比较主串和模式串的下一个位置 3. 失配时, 在模式串中寻找一个合适的位置 如果找到 ...

  8. 动画学信奥 漫画学算法 CSP-J入门级 (三)、算法(依据「NOI大纲」)

    3. 基础算法 贪心法 学不懂算法很烦恼? 快来看动画,学习贪心算法,LeetCode 分糖果 https://www.ixigua.com/6906764305388012035 学不懂算法很烦恼? ...

  9. 动画学信奥 漫画学算法 CSP-J入门级 (二)、C++程序设计 数据结构(依据「NOI大纲」)

    2.1.2 C++程序设计1 小学生C++趣味编程 dllglvzhenfeng的个人空间_哔哩哔哩_Bilibili 信息学奥赛系列课程之啊哈C语言 dllglvzhenfeng的个人空间_哔哩哔哩 ...

  10. 动画学信奥 漫画学算法 CSP-J入门级 (一)、计算机基础与编程环境(依据「NOI大纲」)

    信息学奥赛到底考什么?NOI大纲文字收藏版 信息学奥赛到底考什么?NOI大纲文字收藏版_A-别针少儿编程的博客-CSDN博客 NOI大纲 CSP初赛篇·知识大纲 CSP-入门级-NOI大纲 NOI大纲 ...

最新文章

  1. XFire发布Web Services
  2. mysql如何插入新的字段_Mysql 如何 得到新插入的字段ID
  3. Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】
  4. 【JavaSE_07】Java中类和对象-封装特性
  5. 打开流 fopen 、freopen和fdopen函数
  6. php表格之间设置间隔,html表格如何设置间距
  7. php数据库中数据查询
  8. 百度android广告sdk下载,IS_Freedom
  9. 线程池写入mysql_用多线程写入数据库的问题(150分)
  10. index mysql_mysql 原理~ index的详解
  11. Python使用元类约束派生类中必须实现指定的成员
  12. matlab 提取图像轮廓(图像边缘提取)
  13. MFC鼠标响应、鼠标画线
  14. 文件上传漏洞—简单利用(墨者学院靶场)
  15. C语言度量代码质量常用指标,代码度量标准
  16. C语言-数组-读入学生信息统计各分数段人数并打印
  17. 莫言领取诺贝尔文学奖演讲稿(中英文)----讲故事的人
  18. jquery打印网页当前页
  19. Idea多次启动同一个服务
  20. python判断火车票座位号分布图_火车票座位号分布图图解(是否靠窗)

热门文章

  1. C# WinForm窗体界面设置
  2. Logback 专题
  3. HAProxy高并发问题解决
  4. linux使用lftp文件自动认证上传下载
  5. 经典java NIO框架
  6. CnForums国庆特别版
  7. 模拟滤波器的单位冲激响应+单位阶跃响应+斜坡响应+抛物线响应matlab实现(转载+整理)
  8. intellij存放插件的路径(转载)
  9. monkey補丁後異步速度比同步還慢是怎麼回事
  10. hexo的yelee主题使用自定义字体并用字蛛进行字体压缩的sed脚本