簡體   English   中英

所有不相交對的集合

[英]Sets of all disjoint pairs

給定一組{1,2,3,4,5...n}n元素,我們需要找到所有不相交對的集合。

例如,如果n = 4,則輸出為

{(1,2),(3,4)},   {(1,3),(2,4)},   {(1,4),(2,3)}

我什至不知道如何開始。 我希望有人能給我關於使用哪種算法的建議,以及可能的一些實現細節。

編輯:
遞歸生成(n-1)的Delphi代碼!! 從n = 2 * k個元素中設置(1 * 3 * 5 * 7 ... n-1)

var
  A: TArray<Integer>;

  procedure Swap(i, j: integer);
  var
    t : integer;
  begin
    t := A[i];
    A[i] := A[j];
    A[j] := t;
  end;

  procedure MakePairs(Start: Integer; Pairs: string);
  var
    i: Integer;
  begin
    if Start >= Length(A) then
      Writeln(Pairs)
    else
    for i := Start + 1 to High(A) do begin
      Swap(Start + 1, i); //store used element in the array beginning
      MakePairs(Start + 2, Pairs + Format('(%d,%d)', [A[Start], A[Start + 1]]));
      Swap(Start + 1, i); //get it back
    end;
  end;

begin
  A := TArray<Integer>.Create(1,2,3,4,5,6);
  //be sure that array length is even!!!
  MakePairs(0, '');
  Writeln(PairCount);

輸出:

(1,2)(3,4)(5,6)
(1,2)(3,5)(4,6)
(1,2)(3,6)(5,4)
(1,3)(2,4)(5,6)
(1,3)(2,5)(4,6)
(1,3)(2,6)(5,4)
(1,4)(3,2)(5,6)
(1,4)(3,5)(2,6)
(1,4)(3,6)(5,2)
(1,5)(3,4)(2,6)
(1,5)(3,2)(4,6)
(1,5)(3,6)(2,4)
(1,6)(3,4)(5,2)
(1,6)(3,5)(4,2)
(1,6)(3,2)(5,4)
15

加成
變體也可用於奇數長度數組(奇怪的順序)

  procedure MakePairs(Start: Integer; Pairs: string);
  var
    i: Integer;
    OddFlag: Integer;
  begin
    if Start >= Length(A) then
      Memo1.Lines.Add(Pairs)
    else begin
      Oddflag := (High(A) - Start) and 1;
      for i := Start + OddFlag to High(A) do begin
        Swap(Start + OddFlag, i);
        if OddFlag = 1 then
          MakePairs(Start + 2, Pairs + Format('(%d,%d)', [A[Start], A[Start + 1]]))
        else
          MakePairs(Start + 1, Pairs);
        Swap(Start + OddFlag, i);
      end;
    end;
  end;

對於(1,2,3,4,5):

(2,3)(4,5)
(2,4)(3,5)
(2,5)(4,3)
(1,3)(4,5)
(1,4)(3,5)
(1,5)(4,3)
(2,1)(4,5)
(2,4)(1,5)
(2,5)(4,1)
(2,3)(1,5)
(2,1)(3,5)
(2,5)(1,3)
(2,3)(4,1)
(2,4)(3,1)
(2,1)(4,3)
15

現在不相關:
如果每對僅出現一次(在您的示例中n = 4尚不清楚),則可以使用循環錦標賽算法

n = 4個案例

您必須在這里看到模式。

對於{1, 2, 3, 4}

取第一個元素並與右邊的所有元素配對。

(1, 2), (1, 3), (1, 4)

取第二個元素,並與右邊的所有元素配對。

(2, 3), (2, 4)

取第三個元素,並與右邊的所有元素配對。

(3, 4)

...等等

注意這里的模式。


您將需要一個外部循環來遍歷元素並逐個選擇每個元素。

另一個內部循環遍歷所選元素右側的元素,並與每個元素配對。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM