首页 > 编程知识 正文

stirling公式求极限,第一类stirling数公式

时间:2023-05-04 08:12:30 阅读:186552 作者:758

Stirling公式也称为Stirling公式,用来取n! 的近似值。

在编程中,也运用了Stirling数的思想解决了以下问题。

第一个Stirling公式主题是将n个物体排列成k个非空循环的方法的数量。

3358www.Sina.com/(n=1) )。

n个物体不能不形成环。 这是因为一个物体可以形成环

3358www.Sina.com/(n=1) )。

一个物体可以形成一个圈

33558www.Sina.com/(1=j=I=n ) )。

具体看例子

理解第一类stirling公式递归关系

第n个物体单独占据一个环时其他元素的状况: s(n-1,k-1 ); 如果第n个物体加到了其他环境,那么(n-1 ) s(n-1,k ),因为这个物体可加到第I个物体的左边,所以有n-1种可能。

代码(递归算法) includestdio.hlonglongarr ) 25 ); 长整型1 (intn,int k ) if(k==0||kn ) return 0; if(n==1k==1)返回1; 返回stirling1(n-1,k-1 ) n-1 ) *stirling1) n-1,k ); (}int main ) ) {int n,k; scanf('%d%d ),n,k ); 长整型ans=stirling1(n,k ); printf('%lld ',ans ); 返回0; }代码(非递归算法) includestdio.hlonglongs(25 ); int main () {int n,k; scanf('%d%d ),n,k ); S[1][1]=1; for(intI=2; i=n; I ) for(intj=1; j=i; j ) s(I ) ) j )=s(I-1 ) (j-1 ) ) I-1 ) ) s ) I-1 ) ) j ); }for(intI=1; i=n; I ) for(intj=1; j=n; j () if ) jn ) printf('%lld ',S[i][j]; ELSEprintf('%lld(n ),S[i][j]; }printf('%lld ',S[n][k]; 返回0; )第二类Stirling官方主题是n个苹果放在m个同一个盘子里,不允许清空盘子。 总共有多少种方法?

S(n,0)=0

10个苹果放在100个盘子里是不现实的(kn ),没有盘子也是不现实的(k=0)

S(1,1)=1

所有苹果放在一个盘子里是一种情况(k=1),两个苹果放在两个盘子里是一种情况(n=k ) )。

S[i][j]=S(i-1,j-1)+(i-1)S(i-1,j)

这个递推方程式下面有说明。

理解第二类stirling公式递归关系:

第n个元素单独占据一个子集时其他元素的情况: s(n-1,k-1 ); 第n个元素与其他元素在同一子集时,有ks(n-1,k )的情况。 其结果是s(n-1,k-1 ) ks ) n-1,k )

举一个例子,当n=4,m=3时,s (4,3 )=? 请参阅。

根据Stirling数的式子得到s (4,3 )=s ) 3,2 )3*s ) 3,3 )。

)1) .分析将3个苹果放在2盘上的可能性,

{1,{ 2,3 } ———— { 1,{ 2,3 },4}把苹果4放在一个盘子里

{ 1,3 },2 } ———— { 1,3 },2,4 }把苹果4放在一个盘子里

{ 1,2 },3 } ———— { 1,2 },3,4 }把苹果4放在一个盘子里

)2) .分析将3个苹果放入3盘的可能性,

{ 1,2,3 } ———— { 1,4 },2,3 }现在是三个盘子都满了,另一个苹果在三个盘子里的情况

————{1,{ 2,4 },3}

———— { 1,2,{ 3,4 }

注意:这里用Stirling数模拟n! 算法,当然数字不能超过25。 超过25的话,主题会说模仿结果

代码(分治递归法) include stdio.hlonglongstirling (intn,int m ) if ) m==0|||nm ) /不符合题意的return 0; if(m==1||n==m ) /只有一种方法. return 1; 返回stirling (n-1,m-1 ) m * stirling (n-1,m ); //递归分治(}int main ) ) {int n,m; //n表示苹果的数量,m表示盘子的数量。 scanf('%d%d ),n,m ); 长龙ans=stirling (n,m ); printf('%lld ',ans ); 返回0; }时间复杂度为2的n次方

代码(空间转换时间算法) includestdio.hlonglongs(50 ); //s[n][m]intmain({intn,m; scanf('%d%d ),n,m ); for(intI=1; i=n; I () s ) I ) (1)=1; s[i][i]=1; for(intj=1; ji; j ) s(I ) ) j )=s(I-1 ) [j-1] ) longlong ) j*s[i-1][j]; //这里的n不能超过25。 因为在这里被计算为一个组合(printf ) (%lld(n ),s (n ) ) m )。 返回0; }时间复杂度为n

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。