2
是否有任何有效的方法將集合{1, ... , 2*n}
的所有分區列入n
對中?帶有偶數個元素的集合的分區
最簡單的想法是列出所有排列,然後排列(a1, a2, ... , a8)
意味着劃分{{a1,a2}, ... , {a7,a8}}
。在這種情況下,每個部門有2^n * n!
排列。這是O((2n)!)
。
我可以找到更有效的方法嗎?
是否有任何有效的方法將集合{1, ... , 2*n}
的所有分區列入n
對中?帶有偶數個元素的集合的分區
最簡單的想法是列出所有排列,然後排列(a1, a2, ... , a8)
意味着劃分{{a1,a2}, ... , {a7,a8}}
。在這種情況下,每個部門有2^n * n!
排列。這是O((2n)!)
。
我可以找到更有效的方法嗎?
這是我的筆和紙的算法:
f(set,result):
if the set is empty:
return result
otherwise:
pair one item from the set with
each of the remaining items,
calling f again with the pair added to
the result and out of the set
123456
12 34 56
35 46
36 45
13 24 56
25 46
26 45
14 23 56
25 36
26 35
...
可以很容易地枚舉對。如果允許在「提取」一對之後按順序將索引重新標記爲最低可用值的約定,則可以爲k in(2 * n down至k2)之間的kC2個項目之間得到一系列平坦(而不是樹) 2步驟2)。然後,您可以根據這些選擇做出選擇,從2 * n下降到2,並「讀取」原始索引備份鏈。權衡是O(n)而不是O(1)選擇時間。我會在稍後將一些代碼放在一起,或許是爲了一個真正的「答案」,如果沒有人能夠擊敗我...... – BadZen
謝謝你的答案,但不幸的是我不明白你的alghorithm。如果您編寫一些僞代碼,我將不勝感激。 –
訂單是否重要?如果列出所有排列,你會得到很多與{{y,x} ...}分開列出的'{{x,y} ...}'就是你想要的嗎? –