横看成岭侧成峰 远近高低各不同
2017/2/16,我站在一山脚下,此山名有二,前为离,后为散,终年烟雾缭绕,山脉高耸入云,见不着边际,此时的我昂起头,鼓起勇气,开始了我的登山之旅。
时光飞逝,1个月之后,我的体力略显不济,咬牙支撑,没想到5天过后,陡峭山坡突兀的一个曲折,转为轻松的平坦小道,道上有庭,茶石皆俱,可供人略作休息。就这样,历经了5个月的时光,我过了13座庭,翻了13座小丘,抵达了中途驿站,此地人流络绎不绝,衣食无缺,我走进一家名为"基础"的客栈,决定好好休息一番,但此时的我,心下满满的疑问,此山为何如此诡异,先不说前面那13段曲折的道路,就连我当时抬头所望的山景,每一次都是大相径庭,时而为上、下弦月,时而满月,有时又像那巨树昂然挺立,始终不成定像,与我之前所爬之"线性代数",迥然不同。
不识离散真面目 只缘身在此山中
我于客栈中左思右想,始终没半点头绪,心情烦躁之下,我打开房门,胡乱地向外走去。
不知走了多久,于我面前突然出现一块白色大石,石上有字 –『世间规律何处寻?无非大小也』,剎那间,我恍然大悟,是了是了,规律一事,要不就是看到最广,要不就是分到最细,13座庭中所见山景,并非独立,我拿出纸笔,随手画下山景,上下弦月与满月交迭,是为一面,挺拔古树自成一格,是为另一面,折起纸,前后相接,为山前后两面,起身远看,一为0,一为1,组成此山。
何为离散
当今的计算机科学,仍是基于0与1的计算(仍未普及的量子计算机不列入其中),他并不是用0.1、0.001、1/3...去纪录事情,也就是说,整个计算机科学,是一个整数(0,1,2,3...)的运算架构。而在整个数学体系当中,我们将它粗分为两大类,一为连续,一为不连续,连续是微积分处理的那一块,这里不谈,而不连续,指的就是离散数学所包括的部分,英文名称为discrete mathematics,所以它的"离散"并不是说它东一块、西一块,离离散散,而是指它是一个专门处理整数的数学,为我们的计算机科学打下了扎实的基础。
离散数学当中,我们可以将它粗浅的分为2类,分别是算法与数据结构的基础知识,以及计算器设计。
-
算法与数据结构的基础知识
布尔代数
基于0、1这两个整数,我们额外赋予它们一些性质与运算,此情况下所组成的系统我们成为布尔代数,这也就是我们在写程序时常常看到的boolean值。
集合论
接着我们继续往上发展,因为0、1两数的解释力有限,为了囊括跟表示世上更多的事情,我们引入了整数的概念,就是我们现在看到的0,1,2,3,-1,-2⋯⋯。但是,并不是每件事情都会用到所有的数字,为了对事情做出分类、运算,数学家们引进了集合论(交集、联集⋯),并对一些特别的分类进行命名,最有名的即为质数,而这造就了密码学的基础(RSA)。
关系,图论
能够区分事情之后,为了讨论事情与事情间的性质、转变与关联性,我们引入了"关系"及"函数",在此基础之上,为了让这些关系拥有更多的运算性质与更好的可视性,于是就有了图论(graph)及树(tree),而后更衍生出了许多著名的算法,像是最短距离算法、网络传输算法等等,也有对于算法效率的相关证明,像是排序算法的效率上限,此为运筹学的基础。
排列组合
区分完事情之后,数学家们回归了自己的老本行,着眼于数的计算,他们开始对到底有多少种可能的事情感兴趣,于是乎之后有了排列组合、生成函数,以及之后的计数算法(像坡里亚计数)。
递归
最后,为了讨论算法的效率、程序设计,而有了递归。
-
计算器设计
从古至今,如何去纪录事件一直是一重要的事情,早期人们的结绳记事,到了现在方便迅速的computer memory,数学家们功不可没,而状态机这一章,就是在描述计算器纪录事情的几种型态与方法。
若以身作船,欲渡那0与1交织的汪洋,离散数学就是那可靠的船帆、高效的马达,若无它,仍可渡海,但略显吃力,若有它,航行之时亦可欣赏美景,悠然自得。