Re: [問題] N數列插隊的問題
看板Prob_Solve (計算數學 Problem Solving)作者yauhh (喲)時間14年前 (2010/04/04 01:14)推噓3(3推 0噓 27→)留言30則, 3人參與討論串2/2 (看更多)
※ 引述《ptthidebear (= =)》之銘言:
: 其實我也不知道標題打這樣對不對...Orz
: 我的問題如下
: 假設有兩個數列 A = {a1, a2}
: B = {b1, b2}
: 如果我要數列A不動,數列B插入到數列A裡面
: 且插入後B原本的順序不會改變,即:
: 可能的數列為 {b1, b2, a1, a2}
: {b1, a1, b2, a2}
: {b1, a1, a2, b2}
: {a1, b1, b2, a2}
: {a1, b1, a2, b2}
: {a1, a2, b1, b2}
: 以上簡單舉的範例,實際上數列的數目,甚至數列內的元素都可能更多
: 我有點卡關了關於這個問題,
: 不知道板上的大大有沒有辦法幫忙我...Orz
: 順便一問,這個問題算是排列問題還是組合問題呀@@?
看解題方式決定是排列問題或組合問題. 看起來是排列問題,
但若我先看 A 間隙構成的一系列位置為 {1,2,3},
將 B 兩個元素放在 1 2 3 三個位置的其中兩個,並且 B 兩個元素保持順序,
則可以將問題看成是從 {1,2,3} 中取出兩項的組合. 這樣就是組合問題了.
並且是取重覆數字的組合. 重覆數字表示兩個以上的元素插入同一間隙位置.
而處理這個組合問題,程式就是算盤移珠式的處理法了.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.228.65
※ 編輯: yauhh 來自: 59.112.228.65 (04/04 01:16)
推
04/04 14:18, , 1F
04/04 14:18, 1F
→
04/04 14:19, , 2F
04/04 14:19, 2F
用快一點的講法回答這個問題,先想有一個函數處理插入幾個元素到一個數列:
insert(B[n], A[m])
這是把 n 個 B 項目插入 A 數列, A 數列有 m 個項目. 函數輸出是一大堆組合情況:
insert(B[2], A[2]) ==> { b1, b2, a1, a2 },
{ b1, a1, b2, a2 },
{ a1, b1, b2, a2 },
{ b1, a1, a2, b2 },
{ a1, b1, a2, b2 },
{ a1, a2, b1, b2 }
這個函數做法用 {1,2,3} 取其中兩項並可重覆的組合,依序將 b1 b2 填入兩項位置,
例如,取出的其中一種組合是 {1,3}, 就把 b1 放在 {1} 位置, b2 放在 {3} 位置.
然後把 a1 放在 {1} {2} 位置中間, a2 放在 {2} {3} 位置中間.
哎呀,講得很模糊,看個意思就好.
已知有這個 insert 函數,要把幾個數列合併,就是下列遞迴規則:
combine(L[s]) // L[s] = L1, L2, L3,... , Ls
1. if s = 1, result = L1
2. Else, // s > 1
3. R[k] = insert(L2, L1) // R[k] = R1, R2, R3,... , Rk
4. T3[?] = combine(M3[s-1]) // M3[s-1] = R1, L3, L4,... , Ls
5. T4[?] = combine(M4[s-1]) // M4[s-1] = R2, L3, L4,... , Ls
6. T5[?] = combine(M5[s-1]) // M5[s-1] = R3, L3, L4,... , Ls
... ...
3+k. Tk[?] = combine(Ms[s-1]) // Ms[s-1] = Rk, L3, L4,... , Ls
4+k. result = T[k-2] // T[k-2] = T3[?], T4[?], T5[?],... , Tk[?]
符號系統是我自己定的,慢慢看.
※ 編輯: yauhh 來自: 59.112.230.231 (04/04 17:58)
推
04/04 18:10, , 3F
04/04 18:10, 3F
→
04/04 18:15, , 4F
04/04 18:15, 4F
→
04/04 18:16, , 5F
04/04 18:16, 5F
→
04/04 19:16, , 6F
04/04 19:16, 6F
→
04/04 21:05, , 7F
04/04 21:05, 7F
→
04/04 21:08, , 8F
04/04 21:08, 8F
→
04/04 21:25, , 9F
04/04 21:25, 9F
→
04/04 21:26, , 10F
04/04 21:26, 10F
→
04/04 21:51, , 11F
04/04 21:51, 11F
→
04/04 21:51, , 12F
04/04 21:51, 12F
→
04/04 21:53, , 13F
04/04 21:53, 13F
→
04/04 22:02, , 14F
04/04 22:02, 14F
→
04/04 22:04, , 15F
04/04 22:04, 15F
→
04/04 22:05, , 16F
04/04 22:05, 16F
→
04/04 22:06, , 17F
04/04 22:06, 17F
→
04/04 22:38, , 18F
04/04 22:38, 18F
→
04/04 22:49, , 19F
04/04 22:49, 19F
→
04/04 23:54, , 20F
04/04 23:54, 20F
→
04/04 23:57, , 21F
04/04 23:57, 21F
→
04/04 23:58, , 22F
04/04 23:58, 22F
→
04/05 00:26, , 23F
04/05 00:26, 23F
→
04/05 00:27, , 24F
04/05 00:27, 24F
→
04/05 00:32, , 25F
04/05 00:32, 25F
→
04/05 09:48, , 26F
04/05 09:48, 26F
→
04/05 09:49, , 27F
04/05 09:49, 27F
→
04/05 09:49, , 28F
04/05 09:49, 28F
→
04/05 09:50, , 29F
04/05 09:50, 29F
insert(B[3],A[2])是先準備k個長度5陣列,k是重覆的C(3,3)扣除後項數字小於前項
的數目,5是A,B項目總數. B三項要填到哪些位置也是要做一下C(3,3),從{1,2,3}取
可重覆的三個數字並扣除後項數字小於前項的情況.
在寫insert函數之前,要先寫C(M,N)的組合與總數,扣掉後項數字小於前項,並檢查
M<N時也得到正確結果.
接下來的問題是把B,A填入長度5陣列,程序是先看B有哪些填入{1}位置,都一個一個填
入長度5陣列,然後把A第一項加在之前填入項的後面,然後看B有哪些填入{2}位置,
一個一個填入,然後把A第二項加在之前填入項的後面,然後把B填入{3}位置的項目填入.
insert函數會由C(3,3)產生k個B填入的組合,例如{1,1,1},{1,1,2},{1,1,3},{1,2,2},
{1,2,3},... 根據k種組合不同的情況,把A[2],B[3]混合複製到k個長度5陣列.
※ 編輯: yauhh 來自: 59.112.230.231 (04/05 10:22)
推
04/05 16:48, , 30F
04/05 16:48, 30F
討論串 (同標題文章)
Prob_Solve 近期熱門文章
PTT數位生活區 即時熱門文章