排列与组合的一些定理教案_平行轴定理推导

排列与组合的一些定理教案_平行轴定理推导一,加法原理与乘法原理加法原理与乘法原理是排列与组合的基础。加法原理本质上是分类,乘法原理本质上是分步。分类,就是把一个集合(某事物)分成互不相交的若干独立的部分。比如,概率论中的全概率公式就将事

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一,加法原理与乘法原理

加法原理与乘法原理是排列与组合的基础。加法原理本质上是分类,乘法原理本质上是分步。

分类,就是把一个集合(某事物)分成互不相交的若干独立的部分。比如,概率论中的全概率公式就将事件分成”全划分“

分类思想可以简化程序的时间复杂度。比如:最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

分步,就是第一步干嘛,第二步再干嘛……比如A地到D地,第一步:先到达B地;第二步,再到达C地

 

二,排列

P(n,r)表示从n个数中选择r个数的一个全排列

公式:P(n,r)=P(n-1,r)+p(n-1,r-1)*r

上面公式用到了分类思想:对于某个元素而言,要么选,要么不选。如果不选它,则在剩下的n-1个元素中选r个进行全排列;如果选了它,则在剩下的n-1个元素中只需要选r-1个元素进行全排列了。但是选了的那个元素,一共有r种位置存放(因为这是排列,同一个元素放在不同的位置 属于不同的排列)故p(n-1,r-1)*r。

排列一共有三种:①线排列,就是通常的普通排列。

公式:P(n,r)=n!/(n-r)!

②圆排列,相当于排序的数围成一个圆。比如循环队列的那种实现方式。举个圆排列的例子如下:

a b c d四个字母的线排列共有4!=24种。对于其中的一种排列: a b c d ,它对应着四种等价圆排列:

1) a b c d   2) b c d a   3)c d a b   4)d a b c

因此,对于给定n个数的所有圆排列,一共有 p(n,r)/r种。 因为,一个圆排列可以产生r个线排列。

③重排列

对于线排列而言,某个元素选了之后,就不能再选了(一个元素只能选一次)

对于重排列而言,一个元素可以选多次。

集合{∞·b1∞·b2,….,∞·bn}的一个r排列个数为:nr

即从b1b2bn,共n个元素中选出r个,每个元素可选任意多次,一共有nr排列

还有一种重排列是:每个元素最多只能选K次(某个固定的次数)

{K1·b1,K2·b2,….,Kn·bn}( 元素b1最多只能选K1次)的一个r排列个数为:(K1+K2+….+Kn)!/(K1!K2!…Kn!)

上面表示从b1b2bn,共n个元素中选出r个进行排列,但是 bj最多只能选Kj次,一共有(K1+K2+….+Kn)!/(K1!K2!…Kn!)次排列方式。

 

三,组合

C(n,r)表示从n个数中选择r个数的一个全组合。

公式:C(n, r)=[n!/(r!)(n-r)!]=P(n,r)/r!

公式:C(n,r)=C(n-1,r)+C(n-1,r-1)  这个公式用到了分类思想。对于n个元素的某个元素,要么选,要么不选。

如果选了,只需在 剩下的n-1 个元素中选 r-1个;如果不选,则在剩下的n-1个元素中选r个(因为一共要选r个啊)。

这个公式非常有用,这是杨辉三解公式:其中基准条件C(n,0)=1,C(i,i)=1

C(0,0)

C(1,0)   C(1,1)

C(2,0)   C(2,1)   C(2,2)

C(3,0)   C(3,1)   C(3,2)   C(3,3)

…..        …..        …..

如果要求解C(n,r),可以先求解出C(n-1,r) 和 C(n-1,r-1);再运用公式相加即可。很明显,这是一个与Fib数列类似的递归计算。只不过求Fib(n)时,只有一个参数,而这里有二个参数而已。当然,上面的程序效率是非常低的,因为它重复计算了很多子问题。代码实现如下:

 1 public class YanHuiTriangle {
 2     //compute C(n,r)
 3     public static long c(int n, int r){
 4         if(n == 0 || r == 0)
 5             return 1;//base condition
 6         if(n == r)
 7             return 1;//base condition
 8         else
 9             return c(n-1, r-1) + c(n-1, r);
10     }
11 
12     //compute c(n,r)
13     public static long c_dp(int n ,int r){
14         long[][] dp = new long[n+1][r+1];
15         
16         //init
17         for(int i = 0; i <= n; i++)
18             dp[i][0] = 1;//if(n==0)
19         for(int i = 0; i <= r; i++)
20             dp[0][i] = 1;//if(r==0)
21         for(int i = 0; i <= r; i++)//Assume r < n
22             dp[i][i] = 1;//if(n==r)
23         
24         for(int i = 1; i <= n; i++)
25         {
26             for(int j = 1; j <= r; j++)
27             {
28                 if(j < i)
29                     dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
30                 else if(j > i)//从 i 个元素中选取出 j个元素(j>i 没有意义)
31                     dp[i][j] = 0;
32             }
33         }
34         return dp[n][r];
35     }
36     
37     public static void main(String[] args) {
38         
39         long start_dp = System.currentTimeMillis();
40         System.out.println(c_dp(50, 10));
41         long end_dp = System.currentTimeMillis();
42         System.out.println("dp use time: " + (end_dp - start_dp) + "ms");
43         
44         long start = System.currentTimeMillis();
45         System.out.println(c(50,10));
46         long end = System.currentTimeMillis();
47         System.out.println("non dp use time: " + (end - start) + "ms");
48     }
49 }

 

排列与组合的一些定理教案_平行轴定理推导

 

这个示例完美地证明了DP(动态规划)实现和递归实现的差距。是学习DP的一个好示例。如何将一个程序从递归改成DP?看上面的示例就会有启示了。

其次,这也是0-1背包问题分解的思路,对于某件物品,要么拿走,要么不拿走。因此,这个组合公式在DP问题的分析中经常用到

 

重组合公式:从集合{∞·b1∞·b2,….,∞·bn}中选取r个元素,(不考虑次序),一共有多少种组合?

答案是:F(n,r) = C(n+r-1, r)

 

四,二项式定理

(X+Y)n = C(n,0)X0 Yn + C(n,1)X1 Yn-1 +…..+ C(n,n)Xn Y0

“二项式”定理嘛,就是有两个项相加求n次幂。。。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166377.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • maven 本地仓库的配置以及如何修改默认.m2仓库位置

    maven 本地仓库的配置以及如何修改默认.m2仓库位置本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能是有些jar包的新版本没有在Maven仓库中及时更新。(感觉和网络里面的路由器有点像,你发请求,先在…

    2022年9月24日
    5
  • R-L模型算法的优缺点_风筝模型公式

    R-L模型算法的优缺点_风筝模型公式介绍Logistic回归算法,名字虽带有回归,但其实是一个分类模型。输出Y=1的对数几率是由输入x的线性函数表示的模型,直接对分类的可能性进行建模,并不是直接对分类的结果(0或者1)进行建模:假设一个样本属于正样本的概率为p,则:LR模型是在线性回归的基础上,把特征进行线性组合,再把组合的结果通过一层sigmoid函数映射成结果是1或是0的概率。逻辑斯蒂回归模型的特点:…

    2022年10月13日
    5
  • axis2开发webservice_docker映射出来端口访问不了

    axis2开发webservice_docker映射出来端口访问不了记录一次正式环境服务报错排查记录。某日被通知线上服务告警,错入日志全是Timeoutwaitingforconnection首先梳理项目架构,项目很简单,就是一个使用axis2构建的webserice的客户端开始从此段报错入手排查,定位到MultiThreadedHttpConnectionManager这个类的doGetConnection方法privateHttpConnectiondoGetConnection(HostConfigurationhostCo.

    2025年11月3日
    3
  • 建立友好城市有什么用_算法基础课acwing下载

    建立友好城市有什么用_算法基础课acwing下载原题连接Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和

    2022年8月9日
    5
  • jdk中的哪些源码是必看的_jdk源码阅读顺序

    jdk中的哪些源码是必看的_jdk源码阅读顺序一点一点看JDK源码(〇)liuyuhang原创,未经允许进制转载写在前面:几乎所有的大神都会强调看源码,也强调源码的重要性;但是如何看源码,源码看什么?看了什么用?看了怎么用?困扰很多人,

    2022年8月6日
    7
  • 行存储 VS 列存储[通俗易懂]

    行存储 VS 列存储[通俗易懂]概述目前大数据存储有两种方案可供选择:行存储(Row-Based)和列存储(Column-Based)。业界对两种存储方案有很多争持,集中焦点是:谁能够更有效地处理海量数据,且兼顾安全、可靠、完整性。从目前发展情况看,关系数据库已经不适应这种巨大的存储量和计算要求,基本是淘汰出局。在已知的几种大数据处理软件中,Hadoop的HBase采用列存储,MongoDB是文档型的行存储,Lexst是二进制型…

    2022年7月14日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号