说在前面
好久没有正经的弄过数学了,如果有错误请轻喷。
先从度娘那搜到本科阶段学习的离散数学(概论)大概会包含以下内容:
- 集合论/群论:整个数学界万物起源
- 函数:建立在集合论基础上,函数式入门
- 关系论:建立在集合论基础上,表示高维度对象,数据库入门
- 命题逻辑/布尔代数:逻辑推导与化简
- 组合数学:计算问题通解
- 数论:密码学入门,组合数学理器
- 图论:数学建模入门,数据结构入门,建模界万物起源
- 计算理论:理论计算科学万物起源,编译原理入门,函数式入门,算法复杂性分析
离散数学是计算机科学的基础,学好它就在掌握了日常要用的基本数学工具。因为计算机中的一切,究其根本都使用 0 和 1 来表示的,这就决定了它是一门基于离散数学的学科。
我发现面临的很多实际问题里面都有离散数学的影子。比如强人工智能涉及因果推理,需要逻辑学和布尔代数。计算机中的文件系统涉及树状结构,并行计算涉及图,都属于离散数学。
我可以很负责任的告诉你,如果你能在大一的时候就吃透离散数学这门课,你就等于学完了整个计算机科学、计算机专业(本科阶段)的一切。恭喜你,你可以毕业啦!!!
可能会有人有这样的疑问?我一个学计算机的,编程能力才是最重要的吧,数学学那么好干嘛。我又不干数学公式推导那些,那些是数学系的人干的。
虽然国外的科学家做过统计和证明,目前编程能力的强弱和数学确实关系不大(杠精勿扰)。个人觉得,编程能力主要考验的是宏观构建能力和微观的逻辑思维。
宏观构建能力是什么?例如一个很大的项目摆在你面前,往往是老鼠啃天的感觉,这是初级程序员的必然反映。但是资深的会跳出微观世界,从宏观分析整体的需求和特点,从而构建出合理的拓扑。
那么微观的逻辑思维呢?就是有个清晰的逻辑,这个操作应该怎么进行,遇到各种异常分别怎么处理。做好了结果也很明显,你写完的代码可能有语法错误,但是很少有逻辑错误。日常工作中语法错误是容易找到的,逻辑错误往往很难找很耗时。代码小白可能经常会遇到代码可以编译运行,但是结果就是不对。这很明显就是逻辑错误,即使知道是逻辑错误,可就是不知道错在哪,此刻是很绝望的。
所以逻辑思维的重要性不言而喻了吧。感觉我们现在的教育死记硬背我们很推崇,但是真正的逻辑思维培养都忽略了。我最讨厌的就是背书了,没有之一,这或许就是我文科很差的原因吧。
最后,鸡汤还是要端上来。离散数学必须好好学,要超过老师的课程(因为老师往往也不是高手)。多去网上看看搜索,自己也要多思考,培养好逻辑思维,即使你自己不做编程的工作,做其他领域也会很强。
所以,我又滚回来学了。
集合悖论
说到集合,很多人首先想到集合悖论。
小说《堂吉诃德》里描述了这样一件事,要进入某个城市就要过城门安检系统,该城法律规定,每个要进城的人都要求回答一个问题“你来做什么?”如果说的是真话就被放行,但如果发现说假话,就要被当场绞死,有个聪明人回答“我是来被绞死的。”如果这个人被绞死那他说的就是真话,就应被放行,可如果把他放行,他说的就是假话了,就应被绞死。
波特兰.罗素,英国超级哲学大师,除了哲学他对数学也极有研究,当年他构造了一个集合,这个集合是由一切不属于自身的集合所组成的,然后问这个集合属于他自身吗?把这个集合记作S,如果S属于S,根据S的定义,S就不属于S,但如果S不属于S,同样根据定义,S就应该属于S,无论如何都是矛盾的,这个悖论让当时的大数学家们无比崩溃。
这个悖论在哲学里有很多种表达形式,比如理发师悖论,一个理发师说他只给那些不给自己理发的人理发,然后有人问他是否给自己理发,理发师陷入两难境地。
再比如一个人说他正在说谎,那么如果他真的在说谎,则他说自己说谎就是真话,可是如果他说的是真话,则他是在说谎。哲学就是如此神奇的学科,下图中匹诺曹的鼻子会变长吗?
哲学里至今无法解决这样的悖论问题,但数学里必须要解决它。就像爱因斯坦解决光速问题一样,只要设定光速永远不变,只要承认这种超越常识的认知即可避免各种悖论。同样的,因为罗素悖论的存在,则就可以提前规定不允许存在那样的集合S,就是禁止一切不属于自身的集合所组成的集合的存在。这种用各种限制条件构造集合的方法叫做公理化集合理论,就是建立一些列公理条件,以剔除掉可能存在的矛盾。可见数学是不完美的,数学也不是自由的。