2015-10-27 58 views
2

是否有任何有效的方法將集合{1, ... , 2*n}的所有分區列入n對中?帶有偶數個元素的集合的分區

最簡單的想法是列出所有排列,然後排列(a1, a2, ... , a8)意味着劃分{{a1,a2}, ... , {a7,a8}}。在這種情況下,每個部門有2^n * n!排列。這是O((2n)!)

我可以找到更有效的方法嗎?

+0

可以很容易地枚舉對。如果允許在「提取」一對之後按順序將索引重新標記爲最低可用值的約定,則可以爲k in(2 * n down至k2)之間的kC2個項目之間得到一系列平坦(而不是樹) 2步驟2)。然後,您可以根據這些選擇做出選擇,從2 * n下降到2,並「讀取」原始索引備份鏈。權衡是O(n)而不是O(1)選擇時間。我會在稍後將一些代碼放在一起,或許是爲了一個真正的「答案」,如果沒有人能夠擊敗我...... – BadZen

+0

謝謝你的答案,但不幸的是我不明白你的alghorithm。如果您編寫一些僞代碼,我將不勝感激。 –

+0

訂單是否重要?如果列出所有排列,你會得到很多與{{y,x} ...}分開列出的'{{x,y} ...}'就是你想要的嗎? –

回答

0

這是我的筆和紙的算法:

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 
...