算法:集合的划分原理及代码实现

在大学的离散数学中,会有关于划分原理的介绍。

基本概念

划分的概念就是把一个集合A分成若干个子集a1、a2…的过程,但是必须满足下列条件:
1.a1∪a2∪….∪an = A
2.对于所有i、j 属于0到n, ai∩aj = 空集。
3.a1…an 不为空集

例如
集合A = {1}的划分只有一种情况:{1}
集合A = {1,2}的划分有以下两种情况,分别是{1}{2},{1、2}
集合A = {1, 2, 3}的划分有五种情况:①{1}{2}{3};②{1}{2、3};③{2}{1、3};④{3}{1、2};⑤{1、2、3}
以此类推……

计算

那么就会出现一个问题,一个含有n个元素的集合的划分有多少种呢?
B1、B2 …. Bn分别表示从1到n个元素的集合的划分的个数,而有上述可知B1= 1,B2 = 2,B3 = 5,且令B0=1。
对一般的n有递推公式:
Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn,
C(n,k)是n元素取k个元素的组合数

公式可以这么理解:
n个元素的有Bn个分法,那么n+1个时,多加的这个设为t,
1.把t单独拿出来,剩下的有Bn种分法。即C(n,n)Bn。
2.t和其他元素当成一个整体,这其他元素可以是一个两个三个….
当是一个的时候:则有C(n,n-1)种抽取这一个元素的抽法,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
当是一个的时候:则有C(n,n-1)种抽取这一个元素的可能,而剩下的只有n-1个了,所以是C(n,n-1)Bn-1
以此类推….
当是n个的时候:则有C(n,0)种抽取这一个元素的可能,而剩下的只有0个了,所以是C(n,n-1)B0

全部累加则为Bn+1=C(n,0)B0+C(n,1)B1+.+C(n,n)Bn

代码实现待续….

你可能感兴趣的:(算法)