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

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

  我的答复是:

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

  学员还有问题:

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

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

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

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

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

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

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

学数据结构,是不是一定要先学离散数学相关推荐

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

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! [问题的 ...

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

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

  3. 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...

    原标题:为什么程序员一定要学数据结构?数据结构书单推荐~ 来自:程序员书库(ID:OpenSourceTop) 人们最初使用计算机是用来处理简单的数值计算问题,当你使用计算机来处理一个问题时,一般经过 ...

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

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

  5. 学数据结构,仅仅须要主要的编程体验

    [来信] 老师,您好.我是华南理工大学的非计算机专业大二学生,可是发现自己的编程能力太差.想学数据结构但不知道要学好这个须要什么基础. 大一时学校也仅仅是水水地安排了c++课程,可是特别浅.希望您能够 ...

  6. 小朋友学数据结构(3):二叉树的建立和遍历

    小朋友学数据结构(3):二叉树的建立和遍历 一.基本概念 BinaryTree.png 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树. 根结点:最顶部的那个结点叫做根结点,根结点是所有子结点的 ...

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

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

  8. java实验报告合肥工业大学_合肥工业大学数据结构上机实验代码与实验报告(全)github地址...

    C++实现链队类--合肥工业大学数据结构实验5:链式队列 实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现 ...

  9. 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...

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

最新文章

  1. 解决ModuleNotFoundError: No module named ‘pip‘问题
  2. 1乘到100 python_python每日一练之如何计算你的应发奖金?
  3. C语言常用宏定义(#define)使用方法
  4. 系列笔记 | 深度学习连载(2):梯度下降
  5. 32位linux运行64位jdk,linux64位操作系统装32位jdk解决方法
  6. 设置vs2008代码区的背景色
  7. 每日一题(10)—— 数组与指针
  8. mysql 字符串类型 分区_MySQL分区类型
  9. TVM:在树莓派上部署预训练的模型
  10. 11有没有压力感应_特殊感应器赋予机械手多维触感
  11. 自己配置python环境_windows下python环境的配置
  12. Vue-Cli4笔记
  13. 软件架构(5)---软件架构设计的一些总结和理解
  14. 【Machine Learning】监督学习、非监督学习及强化学习对比
  15. cad2023三维立体图形图纸工程设计绘图软件Autodesk AutoCAD 2023 中文
  16. 什么是负边沿触发_负边沿jk触发器功能测试
  17. Python 分位数回归
  18. thinkphp 官网教程
  19. Windows命令行常用命令
  20. jenkins cicd k8s 多分支流水线构建

热门文章

  1. 图解 Google V8 # 22 :关于内存泄漏、内存膨胀、频繁垃圾回收的解决策略(完结篇)
  2. Heatmap热力图、pandas.DataFrame.corr()、皮尔森相关系数
  3. 企业管理中育人的一些心得
  4. 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践
  5. python网页爬虫xpath应用
  6. 提示程序需要Windows 7 Service Pack 1或更高版本问题如何解决?
  7. 如何锁定计算机桌面图标,用Desklock轻松设置和锁定桌面图标 -电脑资料
  8. [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Reduxreact-redux状态管理详解...
  9. 12.Linux 网络配置
  10. 搜索框的代码css,css搜索框_精美css搜索框代码