找回密码
 注册
Simdroid-非首页
查看: 168|回复: 4

关于组合生成的算法的讨论及疑问?

[复制链接]
发表于 2006-6-11 18:29:33 | 显示全部楼层 |阅读模式 来自 湖北武汉
昨天有朋友问起组合的生成算法,于是就翻了翻组合数学的书,总结一下书上的组合生成算法:
现在以从1,2,3,4,5,6中取3个组合为例。
(1)123、(2)124、(3)125、(4)126,(5)134、(6)135、(7)136,(8)145、(9)146,(10)234、(11)235......。
       很容易从上边例子总结出规律,从而得到递推关系,如上例中的组合256,显然c2,c3已经分别达到5,6,故c1从2修改为3。c2,c3作相应的修改,分别改为4,5得345。即256的下一个组合应为345。
    明白了以上的道理,归纳从一个组合c1c2...cr得到下一个组合的步骤如下:
S1.求满足不等式cj<n-r+j的最大下标i。即i=max{j|cj<n-r+j}
S2.ci=ci+1
S3.cj=c(j-1)+1,j=i+1,i+2,...,r

       这样依照上述算法,就可以罗列出所有的从{1,2,3,.......,n}中取m个数的所有C(n,m)个组合,而且是按照上边那种顺序的。而且我写了个简单的matlab函数如下:
function zuhe(n,m)
%组合生成算法。生成从1到n个数中选m个数的所有组合。
%n----待选集个数。
%m----组合个数。
y=1:m;
disp(y);
while any(y~=n-m+1:n)
%递推算法,返回下一个组合。
    j=m;
    while y(j)>=n-m+j
      j=j-1;
    end
    i=j;
    y(i)=y(i)+1;
    for j=i+1:m
      y(j)=y(j-1)+1;
    end
    disp(y);
end
   
      这也就是说,C(n,m)个组合其实已经和自然数集合{1,2,3,......,C(n,m)}建立了一一对应,但是如果我们想要C(n,m)个组合中的其中第k个组合C1C2C3...Cm,按照这个递推算法就必须求出前k-1个组合,显然随着k的增大,所需的时间损耗是巨大的,甚至规模比较大时,这不是一个可行的算法。
      我想问的就是有没有这样的一种算法,当我们已知自然数0<k<C(n,m),可以很快的(不必去计算前k-1个组合)按照上边的那种组合排序规则求出第k个组合具体是什么?甚至反过来,当我给定一个组合,马上能返回一个对应的自然数k,表示这是第k个组合?

[ 本帖最后由 lvyehuaigu 于 2006-6-11 18:31 编辑 ]
发表于 2013-6-15 18:56:31 | 显示全部楼层 来自 德国
Simdroid开发平台
楼主,你解决你的最后提出的问题了没。我也碰到这样个问题了,希望给点指教。
回复 不支持

使用道具 举报

发表于 2013-6-15 20:20:10 | 显示全部楼层 来自 北京
本帖最后由 liuyalong008 于 2013-6-15 20:21 编辑
desert007 发表于 2013-6-15 18:56
楼主,你解决你的最后提出的问题了没。我也碰到这样个问题了,希望给点指教。 ...

最近本论坛此问题讨论了多次了
http://forum.simwe.com/thread-1080238-1-2.html
http://forum.simwe.com/thread-1079234-1-2.html
  1. >> a=nchoosek(1:6,3)

  2. a =

  3.      1     2     3
  4.      1     2     4
  5.      1     2     5
  6.      1     2     6
  7.      1     3     4
  8.      1     3     5
  9.      1     3     6
  10.      1     4     5
  11.      1     4     6
  12.      1     5     6
  13.      2     3     4
  14.      2     3     5
  15.      2     3     6
  16.      2     4     5
  17.      2     4     6
  18.      2     5     6
  19.      3     4     5
  20.      3     4     6
  21.      3     5     6
  22.      4     5     6
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-6-17 05:40:06 | 显示全部楼层 来自 德国
liuyalong008 发表于 2013-6-15 20:20
最近本论坛此问题讨论了多次了
http://forum.simwe.com/thread-1080238-1-2.html
http://forum.simwe.com/ ...

有没有fortran的?matlab,mathematica里实现这个是很方便,因为软件已经把函数内置了。不过我想的是有没有fortran的,因为一般来说这个速度要比前两个快

点评

除非你的计算量很大,要不然以现在的计算机的速度,Matlab的计算速度应该不会对你的工作有太大的影响的  发表于 2013-6-17 11:09
回复 不支持

使用道具 举报

发表于 2013-6-17 08:48:47 | 显示全部楼层 来自 北京
desert007 发表于 2013-6-17 05:40
有没有fortran的?matlab,mathematica里实现这个是很方便,因为软件已经把函数内置了。不过我想的是有没 ...

fortran的速度是领略过了,你可以open nchoosek,然后把它的代码转成fortran,基本都是基础代码,应该难度不大,但是会很耗时间
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-30 08:26 , Processed in 0.044914 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表