Matlab: วิธีแจกแจงวิธีที่เป็นไปได้ในการสร้างคู่จากรายการ

Jan 20 2021

สมมติว่าผมมีรายชื่อของความยาวกล่าวว่า2k {1,2,...,2k}หลายวิธีที่เป็นไปได้ของการจัดกลุ่มที่2kตัวเลขลงในk(ไม่เรียงลำดับ) n(k) = 1*3* ... *(2k-1)เป็นคู่ ดังนั้นk=2เรามีสามวิธีในการสร้าง 2 คู่ที่แตกต่างกันดังต่อไปนี้

(1 2)(3 4)

(1 3)(2 4)

(1 4)(2 3)

ฉันจะใช้ Matlab เพื่อสร้างรายการด้านบนได้อย่างไรเช่นสร้างเมทริกซ์n(k)*(2k)เพื่อให้แต่ละแถวมีวิธีการจัดกลุ่มรายการ2kตัวเลขเป็นkคู่ที่แตกต่างกัน

คำตอบ

LucienXhh Jan 20 2021 at 15:37
clear
k = 3;
set = 1: 2*k;
p = perms(set); % get all possible permutations
% sort each two column
[~, col] = size(p);
for i = 1: 2: col
    p(:, i:i+1) = sort(p(:,i:i+1), 2);
end
p = unique(p, 'rows'); % remove the same row
% sort each row
[row, col] = size(p);
for i = 1: row
    temp = reshape(p(i,:), 2, col/2)';
    temp = sortrows(temp, 1);
    p(i,:) = reshape(temp', 1, col);
end
pairs = unique(p, 'rows'); % remove the same row

pairs =
    
         1     2     3     4     5     6
         1     2     3     5     4     6
         1     2     3     6     4     5
         1     3     2     4     5     6
         1     3     2     5     4     6
         1     3     2     6     4     5
         1     4     2     3     5     6
         1     4     2     5     3     6
         1     4     2     6     3     5
         1     5     2     3     4     6
         1     5     2     4     3     6
         1     5     2     6     3     4
         1     6     2     3     4     5
         1     6     2     4     3     5
         1     6     2     5     3     4

เนื่องจากมีคนคิดว่าคำตอบเดิมของฉันไม่มีประโยชน์ฉันจึงโพสต์สิ่งนี้

RaymondKan Jan 20 2021 at 17:35

ฉันมีวิธีบังคับเดรัจฉานต่อไปนี้ในการแจกแจงคู่ ไม่มีประสิทธิภาพโดยเฉพาะ นอกจากนี้ยังอาจทำให้เกิดปัญหาหน่วยความจำเมื่อ k> 9 ในกรณีนั้นฉันสามารถระบุได้ แต่ไม่สามารถสร้าง Z และเก็บผลลัพธ์ไว้ในนั้นได้

function Z = pair2(k)
   count = [2*k-1:-2:3];
   tcount = prod(count);
   Z = zeros(tcount,2*k);
   x = [ones(1,k-2) 0];
   z = zeros(1,2*k);
   for i=1:tcount
       for j=k-1:-1:1
           if x(j)<count(j)
              x(j) = x(j)+1;
              break
            end
            x(j) = 1;
       end
       y = [1:2*k];
       for j=1:k-1
           z(2*j-1) = y(1);
           z(2*j) = y(x(j)+1);
           y([1 x(j)+1]) = [];
       end
       z(2*k-1:2*k) = y;
       Z(i,:) = z;
   end