您的位置:首页 > 理论基础 > 数据结构算法

离散数学Notes

2015-07-02 21:54 309 查看
一    集合

基数Cardinality):集合内元素的个数。A的基数一般记为|A|。

平凡子集:P的平凡自己只有2个,P和 Φ。  (之所以谓之“平凡”,时因为每个集合均有这两个子集【Φ的这2个子集重合】)

幂集(Power Set):集合A所有的子集构成的集合,为A的幂集。(其实称幂集,与原文power set关系不大,是因为Card P(A)的值为2^n【n为A中元素的个数】,恰为2 n次  幂,故称之为幂集。有些书籍会以2^A来表示A的幂集。)

对称差(Symmetric difference):把P和Q的所有元素扣除P和Q的公共元素所组成的集合。【P∪Q-P∩Q】

二   归纳方法

数学归纳法的推广

1.有限归纳法

设S为一命题,若

(1)s(n0)成立(n0 >= 1)。

(2)由n0 <= n <= m0 - 1对s(n)成立,能推出s(n + 1)成立。【数学归纳法在有限范围内的应用,故称之为有限归纳法】

则s(n)对n0 <= n <= m0都成立。                                                      

2.归纳法

设S为一命题,若

(1)s(n0)成立(n0 >= 1)。

(2)假设n0 <= n <= k时s(n)成立,能推出s(k + 1)成立。【由假定一个范围里都成立,推出下一个成立,论据加强了】

则s(n)对n >= n0都成立。    

二   二元关系

各类二元关系的性质

自反性:... 自反闭包:...R(A)    [reverse]
        ...

对称性:... 对称闭包:...S(A)
   [symmetric]· 反...

传递性:... 传递闭包:...  R*

关于传递闭包(R*)的定理:

设|A| = n,R是A上的二元关系,则存在正整数k,k <= n,使得R* = R ∪ R^2 ∪ R^3 ∪.....∪ R^k。

由定理,求R*时,k取到n时,已经足够大了,于是可用R* = R ∪ R^2 ∪ R^3 ∪.....∪ R^n来求R*。

据此求法有比较有效的Warshall算法

设R是n个元素上的二元关系,

(1)(a,j)nxn是R的相关矩阵;

(2)  i <- 1;

(3)  for j = 1 to n do

   
if aj,i =1,then do

for k = 1 to n do

aj,k <- aj,k  ∪ ai,k

(4)i <- i + 1

(5)if i <= n,then go (3) else stop.

其结果已变成R*的矩阵形式了,算法时间杂度为O(n^3),是一好算法。

Warshall 的C语言实现:

//Warshall算法C语言实现

#include <stdio.h>

#define N 3

int main (void)

{
int a

= {{1,1,0},{0,0,1},{0,0,0}},i,j,k;

for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
{
if(a[j][i] == 1)
for(k = 0; k < N; k ++)
a[j][k] = a[j][k] || a[i][k];
}

for(i = 0; i < N; i ++)
// 结果输出
{
for(j = 0; j < N; j ++)
printf("%d\t",a[i][j]);
printf("\n");
}

return 0;

}

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息