学数据结构,是不是一定要先学离散数学

Posted 迂者-贺利坚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学数据结构,是不是一定要先学离散数学相关的知识,希望对你有一定的参考价值。

【问题的来源】
  有《数据结构基础》网络课程的学员给我提问:

  哈夫曼树是不是都是双分支,没有单分支的?有点不太懂这个哈夫曼树的构造过程,为什么要这样构造?只知道这样会让权值大的叶节点靠近根节点,小的叶节点远离根节点,为什么权值可以相加再比较呢?

  我的答复是:

  所有叶节点,都是原给定的节点;所有分支节点,度均为2,所以没有单分支。
  很高兴看到你能提出这么多的为什么,然而在数据结构这门课程中,更注重是什么,怎么做的问题,也只能讲到这个层面了,为什么的事情,建议找“离散数学”教材,或其他材料。数据结构中涉及的所有算法,均可以给出严格的理论证明。而计算机作为一门“构造性”的学科,基本味道就是,提出要解决的问题,构造解决的模型,然后证明这个模型解决的就是这个问题,有些时候,还能证明,唯有这样才能解决。

  学员还有问题:

  为什么连通奇数桥的地方为0个或2个的时候有欧拉回路,否则就没有?

  我的答复,是让参照上面的观点。的确,这样的问题,是有严格的证明的,老师只需要给出学员学习的路线即可。我没有必要在只允许500字的答疑区中玩文字。这样做的效果也并不好。
  学员很认真,回复中说:

  我问的是为什么,还是没回复,就是这个结论怎么来的,看来还是要看离散数学才知道?

  由于系统只提示第一次的提问,对于学员的答复,没有小红点提醒。所以,发现学员的答复是几天后的事了。之所以能发现,是他又重新提交了一个问题:

  学数据结构之前是不是一定要学离散数学

  我发现,这是一个非常好的问题。因此有了下面的答复。

【答复全文】
  你问了一个非常好的问题,不少初学计算机的同学该会产生这个疑问(大多数有疑问不提而已,这不是好习惯),更深层地,这里可能包含着我们的学习路线的问题,尤其是需要自主安排学习的时候。
  首先,作为大学的培养方案,是这样安排的。我想解读一下,其中所包含的培养目标,以及背后的学习原理假设。培养目标是,有扎实计算机科学基础的高级技术人才。离散数学从形式化的角度,表达及引导学习者通过定义、定理这一整套严密的体系,初步掌握计算机科学中最基础的知识,以及形成专业的初步计算思维能力。作为数据结构这样一门课程,显然要学好,是需要这些知识和思维的支持的。因此,大学的专业培养方案讲究“系统性”,有了这样的规定。体现的学习路线体现的是大学学习的阶段性特点,先完全掌握离散,再去将数据结构作为其应用学习,前者重纯计算层面的原理,后者引入计算机系统的特征,侧重设计和实现。这样考虑,显然是合理的。
  这样做必然是合理的,然而,合理的却并不仅是这一个。大概所谓“科班”出身的人走的都是这条路子。但在计算机技术领域“半路出家”者中,也不乏高手和成功人士,有些甚至就是没有学过离散数学。一些在起步学习阶段学习不顺利的专业人,在基础阶段没有学好,但后来做的技术工作也能做得不错。这一类型的业内人员,直接接受了数据结构层面上体现的思维方式,掌握了相关的知识和技术,而离散数学内涵,却是在实践中逐渐悟到了,有人清楚他知道了,有人不清楚,或者真的具备了,说不出来而已。其实,说出来又要怎样,有时间干点别的更好。还有些技术岗位,是否具备这样的感悟都无所谓。
  沿上面的观点,每一位学习者要根据自己的情况设计学习。如果你就是计算机专业的学生,培养方案里这样规定了,就先学离散,再学数据结构。学好离散数学,对你“专业人士”的成色,很有说服力。然而,若你接受的并不是“系统化”的培养,且将来的目标是工程领域,关不是更加核心和底层的计算科学和技术领域,直接完成数据结构的学习即可,离散甚至都不必列入计划。不是说离散不重要,而是受限于时间,受擎于陷于离散的逻辑旋涡,可以会让你本不算强大的学习支持体系半路跨塌,先捡更为直接的数据结构学起为妙。在学习的过程中,也要注意一点,就是遇到那种理论性非常强的部分,也就是一些教材中以你具备了离散数学才能学得下去的内容,可以略作了解,在不太影响全局的前提下,暂且放过。如果有必要,且有条件,学完数据结构回头再学离散数学,那又是一种风景。
  其实还有一个视角,我们的学习为什么一定要先理论后实践?这种体系设计有其缘源,离散作为理论,支撑着数据结构这一与直接动手距离更近的体系。而数据结构是关于程序设计的理论,为什么现在以先学程序设计再学数据结构呢?学(学知识)和习(实践)本来是学习的两个方面,先学后习,先习后学(百度下“习而学”这个关键词),都是可以。其实最理想的,是学和习的紧密交融交叉,以知识点和技能为单位的交叉,而不是以课程为单位的交叉。这就是学习中的理论联系实际,实践指导理论。
  我们再换一种角度,讲什么离散数学、数据结构,却也纯是“合理的方案”中的之一,而非“合理的方案”一定只有这一个。叫做这个名字,里面容纳了这些内容,只不过是为了“教学的方便,开课的方便”,做了一个组合、包装而已。我们的目标不是学习了什么课程,这只是一个载体。我们的目标是学到了一些方法、一些技术、一些思维的方式,途径、路线、组合的可能,有千千万。如果是专业学生,就按此安排去做,而作为自学者,这只作为参考即可。
  最典型的案例,各行都有祖师爷,这是神一级的存在。祖师爷修过什么课程?什么先学什么后学?可见,以上讨论的,全是后人生出的问题,满是追随者的思维,少了些创新者的自在。
  我的观点可能将你搞乱了。放在五年之前,我可能还会采取保守的回答,直接解答你的问题即可,而这篇显罗嗦的答复中,我试图告诉你,按你的需要,按你的感觉,争取尽可能直接的方式解决问题。既然你现在学数据结构顺手,就这样学下去。若中间发现有从离散数学中寻求依据的必要,找本书翻翻即可,暂不必进到那个严密的体系中,更不必从离散数学书的第1页开始读起。这是一个知识爆炸的时代,“小步快跑,跑中调整”的策略,是应对之道。
  我以前写过一篇《破除“系统学习”的情结》,你提的问题是关于离散数学与数据结构两门课程,体现的却是学习的路线问题。在新时代,有新时代的选择标准,所以,这篇文章你可以参考。

以上是关于学数据结构,是不是一定要先学离散数学的主要内容,如果未能解决你的问题,请参考以下文章

学C++要不要先学C语言?

学C++要不要先学C语言?

具体数学的内容简介

干货 | 学习大数据为什么要先学Java?

Spring Boot 要怎么学?要学哪些东西?要不要先学 SSM?松哥说说看法

零基础想入门编程需要先学啥