Re: [問題] 從n中取k可重複的組合想不全部展開

作者: LPH66 (-6.2598534e+18f)   2024-05-01 11:30:21
※ 引述《dinohsu1019 (傑生方的鐵粉)》之銘言:
: 投資組合為1將權重k等分分配到n個股票,每個股票可分配權重0(零),1/k,2/k,...1
: (全部)將k等分分配到n個股票。
: 即「從n中取k可重複的組合」,組合數為 C(n+k-1,n-1)。
: 故權重編號範圍為1~C(n+k-1,n-1)
: 權重串列(整數版)為(n,0,...0,0),(n-1,1,...,0,0),...(0,0,...,0,n)。
: 權重串列(小數版) = 權重串列(整數版)/n。
: 我的目的不是要將全部組合展開,而是要隨機映射編號和組合,
: 例如:n=8, k=4時有165種組合,
: 正向:當我輸入編號21時要輸出 (0.375, 0.375, 0.25, 0.0)
: 反向:當我輸入(0.375,0.375,0.25,0.0)要得到編號21
: 有什麼方法可以計算?感謝先
: https://tinyurl.com/yvkpanm6
於是你的需求是將重覆組合以某個順序排序後直接求出該組合是排序中第幾位 (及反之)
這種組合和序數轉換題型有一個通用的想法是:
將這個排序順序做成有某種分組的樣子
(例如第一權重相同的全部排在一起)
然後依照這個分組順序數過去
每數一組直接算出分組有多少元素, 然後判斷你要的第 N 組是不是在這裡面
發現是了的話這個分組的特性就會變成確定的組合項目
然後就能遞迴往下求該組內的對應組合
使用在這個題目的話, 以你所產生的順序來看 (先不要除以總權數)
1 號組合是最後一個權重在第一檔
2~9 號組合是最後一個權重在第二檔
10~45 號組合是最後一個權重在第三檔
46~165 號組合是最後一個權重在第四檔
這是一個大分組, 每一個分組的數量可以先放一個權重在對應的檔再分餘下權重
所以第一大組是權重 7 分在 1 檔, 計 C(1+7-1, 1-1) = C(7,0) = 1 種
第二大組是權重 7 分在 2 檔, 計 C(2+7-1, 2-1) = C(8,1) = 8 種
第三大組是權重 7 分在 3 檔, 計 C(3+7-1, 3-1) = C(9,2) = 36 種
第四大組是權重 7 分在 4 檔, 計 C(4+7-1, 4-1) = C(10,3) = 120 種
可以驗證上面算出來的正是再上面四個大組的數量
所要的 21 號組合, 因 1+8 < 21 但 1+8+36 >= 21
故知屬於第三大組的 21-1-8=12 號組合
而每個大分組中又可依據這最後一檔有多少權重分中組
這 36 種組合中
第三檔有權重 1 的餘下權重 7 分在 2 檔, 計 C(2+7-1, 2-1) = C(8,1) = 8 種
權重 2 的餘下權重 6 分在 2 檔, 計 C(2+6-1, 2-1) = C(7,1) = 7 種
權重 3 的餘下權重 5 分在 2 檔, 計 C(2+5-1, 2-1) = C(6,1) = 6 種
等等
所要的 12 號組合, 因 8 < 12 但 8+7 >= 12 故知屬於第二中組, 即第三檔有權重 2
其為此組 (權重 6 分在 2 檔) 中的 12-8=4 號組合

Links booklink

Contact Us: admin [ a t ] ucptt.com