科学网

 找回密码
  注册

tag 标签: 排列

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

回到最简单的情形
metanb 2020-7-15 13:38
回到最简单的情形。 * * * 考虑两个符号 a 和 b。两物并立曰 “方”。为了往前走,就得有个 “法”。在 “顺序” 的上下文里,只能交换两者的位置:a b ~ b a。此处置换扮演 “法则” 的角色(尽管这里看不出“去除不直”,但够得上简单直接)。注:“法” 似乎总是联系着某种 “运动” 或 “变化”。 . 从“几何”角度看,二元置换相当于做一个(镜面) 反射 ,记作 R。从另一个角度看,从 a b 到 b a 构成一个(二元) 循环 ,记作 C。换句话说,在二元置换中 R = C。这两个操作都有 “ 整体性 ”,即所有元素都离开了原本的位置。 . 关于二元置换只能 “挖掘” 这么多?应该还看到,这里面没有多余的东西,但已经涵盖了 “方” 和 “法”!这是否预示着二元置换 “涵盖”* 了多元置换?回答是否定的!(注:星号是指用 R 和 C 得到多元置换的全部排列)。 . 考虑三个符号 a, b, c。之前已经分析了三元置换:从任何一个三元排列出发,先做一个反射,然后各自做循环,这样就可以得到三元置换的全部排列(6个)。从表面上看,的确只用 R 和 C 就得到了全部的排列。但是在三元置换中,R 的整体性存在“缺陷”:位于中间的符号没有离开原本的位置!换句话说,这里似乎有个奇偶性的问题。又或者,三元置换的反射,隐含了一个“固定” 的操作,记作 F。 . 现在考虑如何得到四元置换的全部排列(24个)。先做一个反射,再各自做循环,这样只得到 8 个排列。从这里去除互相反射的两个排列,余下的6个排列各自做一个反射,得到6个排列。此时共有 14 个排列。新得的6个排列,各自循环,可派生出 24个排列。此时的计数为 8 + 24 = 32。其中有重复的排列... . 不妨具体考察一下。 R: a b c d ~ d c b a C: a b c d ~ b c d a ~ c d a b ~ d a b c C: d c b a ~ c b a d ~ b a d c ~ a d c b 以上是第一轮 RC 操作(一个R两个C)。 . 仔细观察:两个C 序列中,互为反射的有两组(4个排列)!排除两个C序列的奇数组,余下的4个排列各自做一个反射: R: b c d a ~ a d c b; d a b c ~ c b a d R: c b a d ~ d a b c; a d c b ~ b c d a 仔细观察可知,以上两个 R组 的输出端分别是对方组的输入端!换句话说,产生的排列没有跑出第一轮的RC操作。一方面,这体现出 RC 操作形成了一个封闭的系统 (这是有意思的地方);另一方面,这体现出 RC 操作不足以得到四元置换的全部排列。 . 好在三元置换提示,还有个“固定”操作。经过演算发现,可以在三元置换的基础上,通过迭代获得四元置换的全部排列。一般地,对于 n 元置换,通过嵌套的 RCF 操作,即可获得其全部排列。(具体算法保留 :) . 关于置换暂时就探索到这里。这里的启发是: 全排列的数量非常庞大,每个排列中元素的位置完全随意,可是全部的排列却是有结构的 。
个人分类: 科学随笔|1749 次阅读|0 个评论
一道排列组合题
hailanyun0415 2015-7-26 16:50
今天在群里看见一道题, 共5个按钮,对应5种动物。每个按钮按一下出现一种动物。再按一下出现第二只这个动物。按钮每个只能按2次,5个按钮随机按。求最后能产生多少个不同的画面。 这是一个变态的甲方提供给苦逼的课件制作者的,要求乙方把所有的画面都做出来,乙方 估计 是美工,数学应该也不怎么样,做了40几个以后发现不对劲了,效率怎么这么低?于是就进群求教。 我算了两次,推出的第一个公式是:: $\prod_{i=1}^{n-1}{((2i+1)+B )}$ 这个公式 看不懂没事,后面有更简单的。 看上去有点复杂,但其实很好理解,我们用数字来表示动物好了。1个按钮 只会出现一个画面,但 按按钮 不一定照先1后2的顺序 , 所以有3个空位留给第2个按钮 ,就像这样子: ( )1( )1( ) 括号内可以是 两 个2 或 一 个2。那么就有$3+B =6$种情况, 我们用abcd表示,于是 第3个按钮就有5个空位了,就像这样子: ( )a( )b( )c( )d( ) 括号内可以是 两 个3 或 一 个3。那么就有$5+B =15$种情况。abcd有6种情况,所以,共计 15*6=90 种情况。 依次类推,出现的情况依次 是: 2个按钮有6种情况,是4!的1/4。 3个按钮有15*6=90种情况,是6!的1/8。 4个按钮有28*15*6=2520种情况,是8!的1/16。 5个按钮共计45*28*15*6=113400种情况,恰好是10!的1/32。 引入阶乘是由于担心重复计算导致可能性超 出总的可能性, 结果却发现了这一 巧合,这就说明n个按钮,有 (2n)!/2 n 种情况 。 写博文之前还没理解这个公式,写的过程才发现有种更简单的解题思路:n个按钮,总共按出2n个动物,有 (2n)! 种情况,但有2个动物是重复的 ,一共有n组,所以要除以 2 n 。 举个简单的例子,2个按钮,先按出的是黑色,后按出的是 红色 ,那么就有可能按出1 1 2 2 这种情况。但4!里还包括了:1 12 2, 1 1 2 2, 1 12 2 。所以要除以 2 2 。 这种思路就算一开始没想到,做过一遍以后也就有了。这种题做的过程中有一种探究未知的兴奋,但做完了以后,又觉得挺一般的。其实解题过程就如同做爱,射了以后,就会觉得很空虚。乙方倒也不在乎具体的结果,她的意思是超过100个就不想做了,何况是11万个。 --------------- 7.28修改: 1.Binomial 是二项式系数,以前高中学的时候用的是C,现在貌似用B了。 $B =\frac{(2i+1)*2i}{2}$ 2.利用上式证明下面的式子并不难。 $\prod_{i=1}^{n-1}{((2i+1)+B )}=\frac{(2n)!}{2^n}$ 3. $\frac{(2n)!}{2^n}$ 把偶数项的2约掉,会变成 $n!\prod_{i=1}^{n-1}{(2i+1)}$ 这个公式也能对应一个解题思路: 举例来说,假设5个按钮,先按出的是黑色,后按出的是 红色 , 先按出的黑色有$n!$种可能。其中一种可能是: 1 ( ) 2 ( ) 3 ( ) 4 ( ) 5 ( ) 此时 , 5 只有1个空位 可呆 , 1 2 3 4 5 ( ) 放入 5 后, 4 有3个空位 可呆 , 1 2 3 4 ( ) 5 ( ) 5 ( ) 不论 4 放哪里, 3 都有5个空位可呆, 1 2 3 ( ) 4 ( ) 4 ( ) 5 ( ) 5 ( ) 1 2 3 ( ) 4 ( ) 5 ( ) 4 ( ) 5 ( ) 1 2 3 ( ) 4 ( ) 5 ( ) 5 ( )4 ( ) 以此类推, 2 有7个空位, 1 有9个 空位 。 $n=5$ 时,9*7*5*3对应的就是$\prod_{i=1}^{n-1}{(2i+1)}$
个人分类: 其他|3429 次阅读|0 个评论
人生的排列与组合
hangmegn 2014-6-16 05:16
人生的排列与组合 王方汉 人生, 就是一次次, 排列与组合。 遇到的人, 经历的事, 有序,无序, 谁也分不清。 但我知道, 太阳是火热的, 月亮是圆润的, 河水是清澈的, 大地是温暖的。 我没有奢望, 变成 n 的阶乘, 轻云直上。 我很不情愿, 成为无穷小, 趋近于零。 我想把磨难, 一个一个排列起来, 摆放成一串珍珠。 我想把走过的路, 杂乱无章地组合起来, 再也不去打理。
个人分类: 数学诗|3238 次阅读|0 个评论
排列组合的几个程序
moset 2014-1-14 09:50
有 n 个不同球,从中选择 m 个,不考虑选择的顺序,可以列出多少种选择?这问题是简单的,若 n 阶乘表示为: fact(n) ,且把问题记作 C(n,m) 。那么: C(n,m) = fact(m)/fact(n)/fact(n-m) 。当用程序直接列出所有可选,虽然不难,可以直接想到排列加剔除的方式,然而这样的程序显然是非常的丑陋的。应该得有好点的算法去解决它:对球编号 1:n ,问题等价从 1:n 中选择 m 个不同的数字。假设 C(n,m-1) 的排列已知,则每一种排列 {a,b,c,…x} 衍生 C(n,m) 的排列 {a,b,c…x,y} ,其中 y 为 (x+1):n 中的任意,共衍生排列 n-x 项。注:要求每列的数字顺序为增序,即 abc… 。 MATLAB 程序描述: function re=getspre(n,m) re=(1:n)'; while (size(re,2)m) tmp= ]; end re=tmp; end end getspre(5,3) ans = 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 算法要求每个排列是单调递增序列,则令所有选择无重复,对于任意可能出现在 C(n,m) 的序列必然有 C(n,m-1) 的源所以选择没有遗漏。算法结构描述排列数量是以如下方式增长的: ,共有求 和号 m-1 个。 例: 。 另,对于问题:有 n 个编号不同的球,可以有多少种不同的顺序排列方式?记为 P(n) 。那么列出 P(n) 的全部排列可以有很多种方式列出,但程序的结构应力求用更少的时间复杂度,以及更少的内存资源。下面是一个方式,用 MATLAB 描述: function H=sepn(n) if (n==1) H=1; return ; end regu=sepn(n-1); H= ; for i=2:n tx=x(i:i+n-2); H= ; end H= ; L=reshape(ones(size(regu,1),1)*(n:-1:1), ; end sepn(3) ans = 1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1 假设 P(n-1) 的排列已知,序列 T={1,2,…n,1,2,…n} ,那么做序列 Xi={T(i),T(i+1),T(i+2)…T(i+n-2)}, 其中 i=1:n 。对所有 Xi 序列进行 P(n-1) 排列,所有得到的序列末位最后补上 T(i+n-1) 。算法不需要任何多余的判断和剔除,而且存储结构上也不需要多余的资源,最后的到的数组所有位在整个过程中都只赋值一次。方式用 C++ 或者 JAVA 来做会看到更简易结构: package amk2; public class funcs { public int px ; public int n ; public int T ; public funcs( int a){ int i; T =1; for (i=1;i=a;i++) T *=i; n =a; px = new int ; }; public void exe() { int i,j,t; int k; int ln=1; int ; px =0; //******************** M ************************* for (k=1;k n ;k++) { for (i=0;i=k;i++) { tmp =i; tmp =i; } for (t=1;t=k;t++) { for (i=0;iln;i++) { for (j=0;jk;j++) px =tmp +t]; px =t-1; } } for (i=0;iln;i++) px =k; ln*=(k+1); } //******************** M *************************** for (i=0;i T ;i++) { for (j=0;j n ;j++) { System. out .print( px ); System. out .print( ' ' ); } System. out .print(( char )0x0d); } } } 程序中的 M 段描述的就是这个算法结构。 funcs abc = new funcs(3); 则: 0 1 2 1 0 2 1 2 0 2 1 0 2 0 1 0 2 1 最后若是问题是所有 n 个编号的球,取出 m 个排列,允许重复?有上述的两个接口程序,得到这个问题的程序解答很容易,这儿就不列出了。 ************************************************************************************** 在做 P(n) 时,曾想过用第 n 数插入到所有 P(n-1) 的排列的各个间隔中,很容易理解,问题是这样的结构需要链表,不是一个好的方式。常常有些有意思的东西,只是抬笔很麻烦,好在昨夜失眠,还是写点什么好了。
6146 次阅读|0 个评论
关于《一道看似很简单却又很困难的题目》的解答
jixuanhou 2009-3-6 19:29
上次的日记出了一个数学题( http://www.sciencenet.cn/m/user_content.aspx?id=49508 ),我找到答案了!!!看来还是要我自己动手才行,pose到网络上也没有人能帮我,汗!!!查了N多文献,真不容易啊,解答很难看懂,请各位见谅了,因为我也不知道怎么用简单的语言把它描述出来。 我把题目稍微变一下: 有很多个盒子,每个盒子分别标上0、1、2、3、4、等等的标号。有N个完全相同的小球,我任意的放进这些盒子里。最后,我要把每个盒子里的球的数量乘以盒子的标号,然后把他们加起来要等于M. (N和M为正整数) 问,一共有多少种放法? (求出关于N和M的表达式) 注意,题目稍微变了一点点,上次的标号是从1开始的,这次标号是从0开始的,但是这个并没有多少影响,本质还是一样。两个题目有什么关系就留个读者自己思考了。 当M=N的时候,这个问题就是等同于有多少种方案把M分成任意个正整数之和。例如,当M=4时,有5种分配方案,M=1+1+1+1, M=2+1+1, M=2+2, M=3+1, M=4。这个问题是一个数学上非常有名的问题,最初由欧拉提出来的(我和欧拉居然想到了同样的问题,哈哈哈),请参考G. E. Andrews, 《The Theory of Partitions》 Addison-Wesley出版社,1976。在M小于500的时候,都有表可以查,这个在一本书里《Handbook of Mathematical Functions》, edited by M.Abramowitz and I. A. Stegun (Dover, New York, 1972), Chap. 24。了精确的解析解可以在这里找到:H. Rademacher, Proc. Natl. Acad. Sci. Washington 23, 78 (1937)。但是这个精确解析解并不好用,Hardy和Ramanujan给了一个很好用的近似解析解(G. H. Hardy and S. Ramanujan, Proc. London Math. Soc. 17, 75 (1918)) p(m)~exp / 其中c=sqrt(2/3)Pi. 当M大于N的时候,就要对上式有一点点修正,(请看P. Erdos and J. Lehner, Duke Math. J. 8, 335 (1941)) P(m)~p(m)exp /c] 其中 x(M)=cN/(2sqrt(M))-ln . 可以看到当sqrt 远小于N的时候,p(m)和P(m)几乎相等。
个人分类: 科学视角|6229 次阅读|2 个评论
一道看似很简单却又很困难的题目
jixuanhou 2008-12-3 01:03
问题如下: 有很多个盒子,每个盒子分别标上1、2、3、4、5、等等的标号。有N个完全相同的小球,我任意的放进这些盒子里。最后,我要把每个盒子里的球的数量乘以盒子的标号,然后把他们加起来要等于S. (N和S为正整数) 问,一共有多少种放法? (求出关于N和S的表达式) 举例说明:如果标号为1的盒子里有2个小球,标号为2的盒子里有3个小球,标号为4的盒子里有1个小球,其他盒子都是空的,那么总和就是 12+23+41=12. 例如,N=2,S=3,那么就只有一种放法,就是在标号为1和2的盒子里各放一个。 N=2, S=4,那么有两种放法,在1号盒子里放1个在3号盒子里放一个,或者在2号盒子里放两个。 这个题目我04年就想到了,表面上看起来好像很简单,可是一直没有想到过怎么做。我曾经去找数学系教授询问,他想了一个月也没有结果,我也问过不少奥数获奖的学生,他们也没有办法。我同学给我编了个程序,可以得到数字的结果,但是我要的是具体的表达式。
个人分类: 科学视角|6713 次阅读|7 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-23 22:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部