浅谈离散数学和算法与数据结构之间的关系

213 阅读3分钟

最近刚学完离散数学,发现离散数学和算法与数据结构密不可分。但是平时好像几乎没人会提到这些事,可能是数理逻辑这东西相对于算法与数据结构来说,在暴力求解方面体现出来的用处更大,所以少有人关注这方面的东西吧。


首先要提到的是,以我的认知来看,离散数学可以作为算法与数据结构的语言和基础。

为什么这么说呢?我们可以这样来推一下,写程序时需要用到算法,而算法需要建立在数据结构的基础上,而对算法与数据结构来说,他们是离不开离散数学的符号化语言的,或者说他们是离不开集合论的。

我们先来讨论为什么说算法与数据结构离不开离散数学的符号化语言?

我们看下面这几行代码:

//这是一段C语言代码
 int isout[50000] = {0};
 for(int i = 0; i < n; i++){
  for(int j = 0; j < i; j++){
   if(company[i][0] != company[j][0] && company[i][1] > company[j][1] && !isout[j]){
    isout[j] = 1;
    }
   }
  }

在以上代码中,&&符号就相当于离散数学中的合取,只有三个条件同时成立时,才执行isout[j] = 1;语句,诸如此类的事情还有很多,大家可以自行对比看看,那么为何又说离散数学是基础呢?我们再来看一段代码:

#这是一段Python代码
def why_discrete_math():
    x = True  # 假设 x 是布尔值
    if x:
        print("执行某些操作")  # 替换为实际代码
    else:
        print("执行其他操作")  # 替换为实际代码

这段代码只有一个判断条件,当判断条件来到三个时,像这样:

#这是一段Python代码
def why_discrete_math():
  if(x ==true && y == true && z == true):
    do_something()
  else if(x ==true && y == true && z == false):
    do_something()
  ......
  else :
    do_other()

当判断条件来到三个时,会出现2^3共8个分支,这是如果真的这么暴力解决问题的话,难免会显得有些头脑简单,为了避免被认作是头脑简单,我们引入离散数学中的真值表来看看:

XYZRESULT
TTTdo_a
FTTdo_c
TFTdo_a
TTFdo_b
FFTdo_d
FTFdo_c
TFFdo_a
FFFdo_d

这时,我们就不用一个个的分析情况了,整合一下这个真值表,可以给出这样的代码:

#这是一段Python代码
def why_discrete_math():
  if(x ==false && y == false ):
    do_d()
  else if(x ==true && y == true && z == false):
    do_b()
  else if(x ==false && y == true ):
    do_c()
  else :
    do_a()

这时我们就把情况减少到了四种,amazing!!!

相信看到这里的小伙伴都可以理解为什么说离散数学是算法与数据结构的语言与基础了吧。

当然了,离散数学中不只有真值表这一个东西有用,还有像偶图、二叉树等等有趣的天地在等着我们去探险呢!


接下来讨论为何说离不开集合论?(这里只发表一下我浅薄的认知,毕竟知识的海洋是无穷的······)

因为集合论将所有的数学语言整合在了一起(呃,目前来说可以这样理解,但我们要清楚,集合论并不是基石,而是一块松软的泥土),而数学又可以描述世界,所以说建立在集合论上的离散数学是算法与数据结构的基础。


「以上仅为个人感悟,若有失偏颇,欢迎指正。」

本文使用 markdown.com.cn 排版