作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [问题]排列组合
时间Thu Dec 6 23:47:36 2012
※ 引述《loveweib (无情郁金香)》之铭言:
: 我的程式需要对 "1到n取k个" 的所有组合作运算(k=1:n),
: 我现在的做法是 先令 M = nchoosek(1:n,k)去储存所有组合,
: 然後再用for回圈对每一种组合做运算,但是当n太大会出现 Out of memory。
: 想请问是否有其他方式,对一(n,k),每次只出现一个组合,运算完後,
: 再接着出现下一个组合作运算,避免掉储存所有组合数这个步骤。谢谢!!
若把 nchoosek(1:5, 3) 不选的项补成NaN
1 2 3 NaN NaN
1 2 NaN 4 NaN
1 NaN 3 4 NaN
NaN 2 3 4 NaN
1 2 NaN NaN 5
1 NaN 3 NaN 5
NaN 2 3 NaN 5
1 NaN NaN 4 5
NaN 2 NaN 4 5
NaN NaN 3 4 5
等效於
选1 选2 选3 选4 选5
1 1 1 0 0
1 1 0 1 0
1 0 1 1 0
0 1 1 1 0
1 1 0 0 1
1 0 1 0 1
0 1 1 0 1
1 0 0 1 1
0 1 0 1 1
0 0 1 1 1
把此结果视为5bit的2进位数值,则每一个组合可用一数值代表
28
26
22
14
25
21
13
19
11
7
也就是说
for n = 1:N
for k = 1:n
for i = 0:2^(n-1)
if( sum( dec2bin(i)=='1' )==k )
% do something in here
end
end
end
end
给您参考参考
--
哀愁犹如雪花梢然飘落,
白雪厚积,
终究成了孤独的小结晶,
谁能融化我冰冻已久的孤寂?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.61.223
1F:推 loveweib:谢谢 ^^ 12/07 18:12