博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
组合数计算-java
阅读量:7210 次
发布时间:2019-06-29

本文共 1508 字,大约阅读时间需要 5 分钟。

排列组合是计算应用经常使用的算法,通常使用递归的方式计算,但是由于n!的过于大,暴力计算很不明智。一般使用以下两种方式计算。

一,递归的思想:假设m中取n个数计算排列组合数,表示为comb(m,n)。那么comb(m,n)= comb(m-1,n-1)+comb(m-1,n)

解释思想,从m个球中取出n个球可以分成两种情况相加,从m个球中取出一个球,如果它属于n,还需要从m-1中取出n-1个球;如果它不属于n,则需要从m-1中取出n个球

根据这种思想可以通过递归的思想计算组合数:

private static long comb(int m,int n){
if(n==0) return 1; if (n==1) return m; if(n>m/2) return comb(m,m-n); if(n>1) return comb(m-1,n-1)+comb(m-1,n);      return -1; //通过编译需要,数字无实际意义 }

适用递归计算,当数字较大时,递归深度过深,会相对耗时,甚至堆栈溢出。如果对性能有要求,可以建立键-值对,存储计算结果,防止,反复计算。

static Map
map= new HashMap
();private static long comb(int m,int n){ String key= m+","+n; if(n==0) return 1; if (n==1) return m; if(n>m/2) return comb(m,m-n); if(n>1){ if(!map.containsKey(key)) map.put(key, comb(m-1,n-1)+comb(m-1,n)); return map.get(key); } return -1; }

二,对数的计算思想:跟据定义,comb(m,n)=m!/(m-n)!n!

两边取对数,log(comb(m,n))=log(m!/n!)-log((m-n)!)

计算之后,再通过exp计算最终结果。优点,不会出现数组越界,缺点:计算非常大的数字时,由于精度误差,结果转化为整数时可能有偏差

private static double comb_log(int m,int n){        int  i;        if(n>m-n) n=m-n;        double s1=0.0;        double s2=0.0;        for (int j = m-n+1; j <=m; j++) {            s1+=Math.log(j);        }        for (int j = 1; j <=n; j++) {         s2+=Math.log(j);        }        return Math.exp(s1-s2);    }

 

转载于:https://www.cnblogs.com/xueyudlut/p/9498275.html

你可能感兴趣的文章
服务器主板点不亮排查
查看>>
Linux 用户组权限讲解
查看>>
18款开源Linux 管理系统
查看>>
国外值得关注的网站系列之二-社交化推荐网站GetGlue
查看>>
IT项目管理之脸皮厚大实话
查看>>
在windows上搭建一个ftp服务器
查看>>
if……then
查看>>
脚本录制两种模式 HTML-based script和URL-based script模式
查看>>
DHCP服务器在企业里的各种应用方案
查看>>
C#编程--ref,out,TryParse
查看>>
搭建NFS共享目录,解决wordpress负载均衡图片上传问题
查看>>
分享无限:偷拍IBM power 720内部外部图片
查看>>
Android Activity生命周期
查看>>
蓝鲸“配置平台”正式开源
查看>>
虚拟化Hadoop集群的部署和管理 - 基本操作
查看>>
HTML5教程:1.3 HTML 5的使用理由和待解决问题
查看>>
PostgreSQL连接问题(Net LO problem)
查看>>
iOS 缓存的获取计算与清除归零
查看>>
我的友情链接
查看>>
参考TinyOS官方网站实现BlinkToRadio
查看>>