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

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

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

  我的答复是:

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

  学员还有问题:

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

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

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

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

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

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

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

时间: 2024-09-11 20:35:36

学数据结构,是不是一定要先学离散数学的相关文章

C语言顺序表基本操作,刚学数据结构还不懂怎么操作?求助!!

问题描述 C语言顺序表基本操作,刚学数据结构还不懂怎么操作?求助!! 1.建立一个顺序表,要求从键盘输入10个整数,并将该顺序表的元素从屏幕显示出来. 2.用函数实现在顺序表中查找其中一个元素,如果找到,返回该元素在顺序表中的位置和该元素的值,否则提示无此元素. 3.用函数实现顺序表的插入和删除操作.由用户输入待插入元素及插入位置,将完成插入后的顺序表输出:由用户输入删除第几个元素,将完成删除后的顺序表输出. 解决方案 http://zhidao.baidu.com/link?url=n-XCi

c-刚学数据结构写了个链表,调试无报错,一运行就显示“main.exe停止运行”。

问题描述 刚学数据结构写了个链表,调试无报错,一运行就显示"main.exe停止运行". 刚学数据结构,写了个链表,调试无误,一运行就显示"main.exe停止运行",很头疼,求大神指点..谢谢~ 代码如下: #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -1 define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 define LISTINCREMENT

学数据结构当然会比学第二门语言觉得难

[问题] 贺老师,我有一个问题:在同时学C++和数据结构时,课本是谭浩强编的<C++程序设计>和烟蔚敏编的<数据结构(C语言版)>,为什么我感觉C++挺好学的,觉得这本书写的太好了,都比老师交的提前自学了好几章,而数据结构,我却是比c++先接触的,感觉很难,觉得书编的不好,特别书中函数都是抽象.大概.笼统的,没有一个完整的代码,无法参照学习,感觉都看不下去了,没法自学,而老师讲都又很笼统,特别落实到代码上很难,难道是学新的语言比较容易(背景是大一时我们一整年学的都是C),而深入.进

模板类-学数据结构是一个叫殷人昆写的,书里各种bug,下面的重载函数到底怎么写?不要+内容,只要重载格式

问题描述 学数据结构是一个叫殷人昆写的,书里各种bug,下面的重载函数到底怎么写?不要+内容,只要重载格式 #ifndef SORTEDCHAIN_INCLUDED #define SORTEDCHAIN_INCLUDED #include #include using namespace std; template struct ChainNode { E data; ChainNode* link; ChainNode(): link(NULL){}; ChainNode(E& e1, Ch

c语言-为什么算法可以没有输入,可以举个具体的例子吗 急!!我刚学数据结构,好多都不理解,求大神支招!

问题描述 为什么算法可以没有输入,可以举个具体的例子吗 急!!我刚学数据结构,好多都不理解,求大神支招! 为什么算法可以没有输入,可以举个具体的例子吗 急!!我刚学数据结构,好多都不理解,求大神支招! 解决方案 不一定需要输入,第一你可以在程序之中就把初始值传入函数,或者是你写数据生成器也不用输入. 解决方案二: 不只是算法没有输入,,很多也不需要输入啊

小白刚学数据结构,有问题请教,求大神解答

问题描述 小白刚学数据结构,有问题请教,求大神解答 请大神帮我看一下代码有什么问题,我一直找不出问题在哪里 #include #include #include #define maxsize 100; typedef char datetype; typedef struct { datetype date[maxsize]; int len; }sq; void creatlist(sq *L) { int n; int i; char tmp; printf("请输入一个数字给n:&quo

学数据结构,只需要基本的编程体验

[来信] 老师,您好.我是华南理工大学的非计算机专业大二学生,但是发现自己的编程能力太差.想学数据结构但不知道要学好这个需要什么基础.大一时学校也只是水水地安排了c++课程,但是特别浅.希望您能够按照知识进阶列出一个学科顺序表,要是能附带推荐几本经典教材就更好了,谢谢老师. [回复] 学习数据结构,只需要会用一种语言,能编写一般的程序,这就可以了.如果现在你有困难,我觉得还是在学C++时实践没有跟上.学校开的课程,需要自己配备一定的自主学习.你喜欢编程,对学校C++课程感觉水和浅,因为这学期我也

计算机英语-求推荐计算机相关的英语 是学雅思的单词 还是学托福的单词好?

问题描述 求推荐计算机相关的英语 是学雅思的单词 还是学托福的单词好? 希望大神能帮忙解答,感觉计算机行业需要经常用到外文文档.不知道什么方面的英语能够很好的切合住. 解决方案 事实上雅思.托福未必管用.关键还是多看,特别是中英文对照看,英文文档不同于小说.新闻.它的语法.词汇都比较固定.只要你看的多了,自然是不难. 特别是搞清楚一些词汇的含义,计算机词汇有特定的含义,这些含义既要和英语中通常它的意思联系起来,也要搞清楚它在确定的上下文中的意思. 比如说Comment,这个词很常见,就是代码注释

《网络零售学》——第一章网络零售学导论

第一章 网络零售学导论 第一节 网络零售学及其研究对象 一.网络零售学的研究对象 (一)学科研究对象的确立标准 研究对象是对某一学科研究范围及内容的高度概括.确定研究对象的意义是学科研究的起点,只有确立了研究对象,才能建立科学的学科体系.任何学科都有其特定研究对象,没有特定研究对象的学科就不能称其为独立学科,而研究对象的区别正是学科间的根本区别标志. 对于学科研究对象的确立标准没有统一认识,但一般认为,学科的研究对象应能够回答两个问题:研究什么?为什么有必要研究?由此形成了选择学科研究对象的三个