Re: [問題] n個元素的集合
: → tropical72:有,目前看過最高效 (唯一 codepad 沒跑到當的) 的演算 11/22 01:31
: → tropical72:法在 TAOCP Vol4, 我也看不懂,只是照 pseudo code 編 11/22 01:31
: → tropical72:http://codepad.org/812zGijk ,看懂的人麻煩解釋一下 11/22 01:32
: → tropical72:另不知道是什麼原因要窮舉所有子集合?光64bits要窮舉完 11/22 01:39
: → tropical72:就要費很多時間,建議先確認你的方向是不是正確。 11/22 01:40
大略說一下
這其實是一個遞迴演算法的改進版
這個遞迴演算法是這樣的:
Permutations(list)
1. 如果 list 只有一個元素 {x} 則回傳序列 {(x)}。 否則的話:
2. 去掉 list 的最後一個元素後遞迴呼叫 Permutations 取得所有排列
3. 將這最後一個元素插入在每個得到的排列的每個空間(含頭尾)即可
例如三個元素時
呼叫 Permutations({1,2}) 得到 {(1,2), (2,1)}
再把 3 插進上面的每個排列的每個空間即為
{(1,2,3),(1,3,2),(3,1,2),(3,2,1),(2,3,1),(2,1,3)}
而四個元素則再把 4 插進上面每個排列的每個空間
就得到上面連結執行結果的 24 種了
這支程式它實際上是去計算現在這個排列到下個排列要交換哪兩個相鄰元素
有注意看的話你會發現所產生出來的序列 最後一個元素是呈之字形的順序
(例如上面執行結果裡的 4 就是這樣)
這使得所產生的每個序列和下個序列之間都只有兩個相鄰元素對調
由此再配合上 X 和 Y 陣列的輔助計算就能用迴圈的方式一一把所有組合列出來了
我沒有細追不太清楚
但 Y 看起來好像是 i 下次要往哪個方向移
X 則看起來像是 i 在 1~i 中的位置...
--
先說我沒看 TAOCP 的那一章節 (實驗室裡只有供著 Vol.1 和 Vol.2 而已...)
這是從輸出的型式推測應該是這個演算法的
--
いああオレたちには見えてるモノがあるbデ きっと誰にも奪われないモノがあるはずさ
け 開口一番一虚一実跳梁跋扈形影相弔yュL羊頭狗肉東奔西走国士無双南柯之夢 歪も
ぶ 意味がないと思えるコトがある ラPきっとでも意図はそこに必ずある んの
く 依依恋恋空前絶後疾風怒濤有無相生 ラH急転直下物情騷然愚者一得相思相愛 だが
ろ 無意味じゃない ラ6あの意図が 恋た
で 有為転変死生有命蒼天已死黄天當立 !!6五里霧中解散宣言千錯万綜則天去私 のり
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.83
推
11/22 14:46, , 1F
11/22 14:46, 1F
→
11/22 14:47, , 2F
11/22 14:47, 2F
→
11/22 14:47, , 3F
11/22 14:47, 3F
→
11/22 17:02, , 4F
11/22 17:02, 4F
推
11/22 19:03, , 5F
11/22 19:03, 5F
→
11/22 19:03, , 6F
11/22 19:03, 6F
→
11/22 19:03, , 7F
11/22 19:03, 7F
推
11/22 21:13, , 8F
11/22 21:13, 8F
→
11/22 21:14, , 9F
11/22 21:14, 9F
推
11/23 00:18, , 10F
11/23 00:18, 10F
討論串 (同標題文章)