Re: [問題]排列組合
※ 引述《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
推
12/07 18:12, , 1F
12/07 18:12, 1F
討論串 (同標題文章)