离散数学学习指北

[TOC]

应老师之约,特写此文,顺便纪念下三个学期的离散数学满绩。

没有笔记,只是经验。

水平有限,仅供参考。

什么是离散数学

抄一段维基百科:smile:

离散数学(英语:discrete mathematics)是数学的几个分支的总称,研究基于离散空间而不是连续的数学结构。与连续变化的实数不同,离散数学的研究对象——例如整数、图和数学逻辑中的命题——不是连续变化的,而是拥有不等、分立的值。因此离散数学不包含微积分和分析等“连续数学”的内容。离散对象经常可以用整数来枚举。更一般地,离散数学被视为处理可数集合(与整数子集基数相同的集合,包括有理数集但不包括实数集)的数学分支。但是,“离散数学”不存在准确且普遍认可的定义。实际上,离散数学经常被定义为不包含连续变化量及相关概念的数学,甚少被定义为包含什么内容的数学。由于运算对象是离散的,所以计算机科学的数学基础基本上也是离散的。我们可以说计算机科学的数学语言就是离散数学。人们会使用离散数学里面的槪念和表示方法,来研究和描述计算机科学下所有分支的对象和问题,如计算机运算、编程语言、密码学、自动定理证明和软件开发等。相反地,计算机的应用使离散数学的概念得以应用于日常生活当中(如运筹学)。

换句不恰当的话说,因为计算机只能处理「离散」对象,所以出现了「离散数学」。是作为计算机专业的学生,必须学好的一门课。

至于离散数学在计算机外的应用,可以参考一下 有哪些离散数学/图论应用在数学/CS以外学科的例子?

集合论与数理逻辑

强烈建议上课认真听讲。

从这里开始,就需要锻炼抽象思维了。它把现实世界的各种实体、关系,转化为了公式、逻辑,与小学时期的应用题有异曲同工之妙啊:sunglasses:。自然语言的好处是提供直觉上的理解,坏处是不精确。形式语言的好处是精确,坏处是无法提供直觉上的理解。二者相辅相成吧。

这里给出我个人、不准确的一些理解:

  1. 给出一个对象的集合,一般满足有限、可数的性质;
  2. 给出这个集合元素之间的关系,对这些关系的表述既可以使用集合意义上的「有序元组」(ordered tuple) 也可以使用逻辑意义上的「谓词」(predicate);
  3. 给出在这个集合上的运算以及参加运算的元素的个数,即函数
  4. 给出描述上述公理、定义、定理的语言,这就是一阶语言

对于这些的理解,可能会影响后面面向对象编程语言里的对类的理解。

对于函数的理解,可能会影响后面函数式编程的理解。

对于关系的理解,可能会影响后面数据库的理解。

但是,集合论与数理逻辑这一块切忌钻牛角尖,如果有些术语、例子实在是太过拗口,不妨先跳过,等学得差不多了,再回过头看看,相信还是能顺利理解的。如果还不行,再去问问同学、老师吧,这里最好不要一个人死憋着不问(如果最后是例子错了你会嘿嘿嘿的)。

最后推荐一本黑皮书,《离散数学及其应用》,Rosen 著,图书馆就有。个人建议看中文版,因为这样可以自己找翻译错误,并以此验证自己的知识水平:joy:。同时,可以借这本书体验一下中英文、国内外对计算机教学方式的差异,为接下来的几年学习做好准备。

除此之外,左孝凌和屈婉玲老师写的教材对我帮助也很大。不过,左孝凌老师写的那本书,我在图书馆找了好久好久才找到。

学完这部分后,可以像卓里奇一样高贵冷艳地调戏出卷人了。证明中不出现文字,而应该仅有以逻辑语句完成。后果自负哟。举一个数学归纳法的例子:

$$ (E \subset \{N}) \wedge(1 \in E) \wedge(\forall x \in E(x \in E \Rightarrow(x+1) \in E)) \Rightarrow E=\{N} $$

图论与组合数学

强烈建议上课认真听讲。

我平时会打打三人团体竞技游戏 XCPC,所以对这方面比较熟悉。

先说组合数学。

相信能考上大学的,高中一定学过数学吧:yum:。在这里没加什么特别难的东西,譬如卡特兰数、斯特林数、康托展开、卢卡斯定理、二项式反演等等都没有涉及。

好好听课,多多练习,不要吃老本。

再说图论。与数据结构相辅相成。

这里可能是一些同学的瓶颈了。

首先要学会更进一步的抽象,把具体事物用图来描述。换句话说,如何进行数学建模?多看书,可以去知乎上搜搜,多悟。理解通彻后,再之后就好多了吧,都是在图上的一些定义、应用,没什么特别 trick 的地方。只要看一遍书和例题,相信就懂得差不多了。

在这个学期的学习里,为了寻找单源最短路径,有了迪杰斯特拉算法;为了找到最小生成树,有了Kruskal、Prim 算法;为了有向无环图上不相交路径的计数,有了 LGV 引理(而这需要线性代数的知识)。。。

在之后的学习里,可能会疑惑垃圾回收是怎么一回事,循环优化为什么这么牛逼,正则表达式引擎该怎么写,寄存器分配,这些都与图论有关。譬如我在考试月写的一款编程语言wen,理论设计部分就用到了大量图论知识,快来 star

代数结构与初等数论

这是我在离散数学里考得最差的一门,但同时是印象里考试最简单的一门(可能请假次数过多了吧)

我平时会打打三人团体竞技游戏 XCPC,所以对这方面挺熟悉的。

先说初等数论。

相信能考上大学的,高中一定学过数学吧:yum:。在这里没加什么特别难的东西,譬如扩展中国孙子剩余定理、二次剩余、拉格朗日定理等等都没有涉及。

剩下的内容也很少,编程语言学了俩学期了,模运算应该也滚瓜烂熟了,其它应该没什么难度了吧。

再说代数结构。

老师考察得比较简单,像原根、Burnside 引理、Pólya 定理等一些近世代数的东西没有涉及。

不过可能也是一些同学的最后瓶颈了。这里应该是要求最高的抽象了。

群环域相当于理论归纳,用它们对一些离散的数学结构进行分析。多看书,多理解,多悟。悟不出来去知乎上大佬们的一些回答,这里我没找到合适的课外读物推荐。

举几个好玩的例子,

  1. 1×0=0 是因为 0 乘以任何数字都等于 0,还是因为 1 乘任何数字都等于那个数?
  2. 能不能定义一个数 x,与 0 的乘积等于 1?
  3. 如何保证数据存储安全、数据处理安全?

请读者自证,证不出来可以上网搜题解。

考试

过一遍书本,过一遍 PPT,相信老师是不会为难大家的(要是为难就好了)

多刷题,多刷题,多刷题。

多检查,多检查,多检查。

千万不要让考试结果、复习过程影响你对计算机的热爱之情!

文章目录