• 转帖:算法好学吗?——《大话数据结构》读者书评


    原文地址:http://gossipcoder.com/?p=739 作者:陈钢
      
      摸着键盘写这篇东西的直接动力是给程杰刚刚出版的大作《大话数据结构》写个书评,外加利用我这微乎其微的影响力做做广告——怎么说程杰同学也送了我一本亲笔签名的繁体版《大话数据结构》。不过,今天早上看到了刘未鹏的新文章,“知其所以然(三):为什么算法这么难?”,我觉得光写书评不太爽,写点我学算法的失败经历吧,顺带说说程杰同学的这本新书。
      
      说实话,本文的标题是个伪命题。算法是否好学,或者说是否容易学,完全取决于你的学习目标,是要应付下个月的考试,还是准备考个研究生,或者是想搞定二三流公司的笔试,还是想去微软当科学家——当然,不排除有人的目标是图灵奖。不动脑子都能知道,只是应付考试的学习应该是难度最低的,真正在复杂的业务流程中合理的设计和应用高效的算法的难度无疑要高出一截,至于图灵奖——我也不知道,那玩意太遥远。
      
      目标的不同导致了所需的学习资料是完全不同的,《大话数据结构》的封底是这样描述它的目标读者的:
      
      《大话数据结构》适合学过一门编程语言的如下读者:
      在读的大中专计算机专业学生;
      想转行做开发的非科班人员;
      想考计算机专业研究生的应届或在职人员;
      工作后想重温数据结构和算法的程序员;


      显然,从目标读者就能看出,这本书不是给“高手”看的。我曾经扮演过其中的一种角色,“想考计算机专业研究生的应届或在职人员”,不过我那时候读的是一本经典的教材,严蔚敏老师的《数据结构》(其实在《大话》前言中也提及了这本书)。因为所学的专业跟计算机搭界不多,所以在考研前所有的计算机知识来自于三门包罗万象却连点到即止就算不上的课程:计算机导论、计算机软件设计、计算机硬件设计。当时的学习方法就是刘未鹏说的“背”,不管算法和各种数据结构的来龙去脉,也无论能否理解,一律背下来。反正当时的目标就是考研究生。
      
      但我也发现,本为考研究生而短期恶补的知识,应付一般的企业笔试和面试也勉强够了。考研复习其实挺枯燥的,每天重复几乎类似的生活。有天同学说,传说中的华为来学校宣讲。为了调剂一下生活,捏着一页纸的简历就跑去应聘软件开发职位。一轮笔试,几轮面试下来,凭着我两个月恶补的那点数据结构知识,我竟然全部通过了。体验完签约仪式——注意,只是体验了一下,然后回到教室继续备考。
      
      最后,考研的专业课也得了个还不错的成绩。从这方面看,算法、数据结构之类的东西学起来似乎并不难,短时间抱着死板的教材就能应付考试,应付企业的笔试面试。如果能读读《大话》这样通俗易懂的读物,达到这样的目的应该是更加容易。我当时真正的水平怎么样?啥都不会,动态规划都写不完整,分治法之类的东西就更不懂了。NP-complete理论?没听说过。光是背了几篇经典小说的人,看过小说背景介绍的人是写不出什么好东西的。必须要了解别人作品的前前后后方方面面,自己不停地写,不停地想,才有可能真的写出好东西。算法也是如此,弄清楚每个数据结构、算法的每个细节的缘由,才能设计出自己的好算法。但市面上能像刘未鹏的“知其所以然(三):为什么算法这么难?”这样解析算法的书是没有的。即使是刘未鹏写了几篇,要等他攒出一本完整的书,也需要漫长的等待。而且全书每个算法的解析是否都能到这个水平也是个疑问。
      
      程杰兄的《大话》不可能解决这种问题,也没有填补这个空白的企图。应付考试,参加笔试面试,方便看懂开发文档——这才是《大话》能办到,而且办得不错的事情。很难想象如何在公交车上学习严蔚敏老师的《数据结构》或是饿啃《算法导论》,但我今天确实在回家的公交车上读完了两章《大话》。
      
      但如果搞计算机的人都停留在《大话》所要达到的水平,那无疑是一种悲哀。我学算法的经历之所以失败,正是因为如此。为了考试而啃完严蔚敏老师的《数据结构》和一两本考试参考书之后,我再也没有读完一本算法的书,也没有自己写过稍有难度的算法。所以,水平也就一直停留在看看文档,调调函数的水平上。
      
      希望有人能以《大话》为起点,而不是以读完此书为终点;也期望程杰兄能创作出更高水平的佳作。

    陈钢同学是我的朋友,在我写作时给予了我很多帮助。此评论写得相当客观,并没有夸大地说好话,而是强调了《大话数据结构》仅仅只是数据结构与算法学习的起步而已。我转帖出来,也是希望读者可以了解,算法要学好,可真不是几日之功。我们都需要不断努力!

  • 相关阅读:
    0514JS基础:操作document对象、事件、this
    Java 多态
    Java 抽象类和接口
    Vue中v-for属性
    Vue基础语法
    Vue 自定义按键修饰符,自定义指令,自定义过滤器
    ES6 剩余参数
    ES6 箭头函数
    ES6 解构赋值
    ES6 变量声明 var let const的区别
  • 原文地址:https://www.cnblogs.com/cj723/p/2103456.html
Copyright © 2020-2023  润新知