ค้นหาการจับคู่ต้นทุนขั้นต่ำระหว่างอาร์เรย์ของจำนวนเต็ม


12

พิจารณาสองเรียงอาร์เรย์ของจำนวนเต็มและYขนาดเมตรและnตามลำดับเมตร< n ยกตัวอย่างเช่นX = ( 1 , 4 ) , Y = ( 2 , 10 , 11 )XYmnm<nX=(1,4)Y=(2,10,11)

เราบอกว่าการจับคู่เป็นวิธีการจับคู่องค์ประกอบของแต่ละบางกับองค์ประกอบของYในลักษณะที่ไม่มีสององค์ประกอบของXจะจับคู่กับองค์ประกอบเดียวกันของ Y ค่าใช้จ่ายของการจับคู่เป็นเพียงผลรวมของค่าสัมบูรณ์ของความแตกต่างในคู่XYXY

ตัวอย่างเช่นกับ , Y = ( 2 , 10 , 11 )เราสามารถทำให้คู่( 7 , 2 ) , ( 11 , 10 )ซึ่งจะมีค่าใช้จ่าย5 + 1 = 6 ถ้าเราสร้างคู่( 7 , 10 ) , ( 11 , 11 )ค่าใช้จ่ายจะเท่ากับ3 + 0X=(7,11)Y=(2,10,11)(7,2),(11,10)5+1=6(7,10),(11,11) 3 ถ้าเราได้ทำคู่ ( 7 , 11 ) , ( 11 , 10 )ค่าใช้จ่ายจะได้รับ 4 + 1 = 53+0=3(7,11),(11,10)4+1=5

เป็นอีกหนึ่งตัวอย่างที่จะใช้ , Y = ( 2 , 10 , 11 , 18 ) เราสามารถทำให้คู่( 7 , 2 ) , ( 11 , 10 ) , ( 14 , 11 )สำหรับค่าใช้จ่ายของ9 คู่( 7 , 10 ) , ( 11 , 11 ) ,X=(7,11,14)Y=(2,10,11,18)(7,2),(11,10),(14,11)9ค่าใช้จ่าย7(7,10),(11,11),(14,18)7

งานคือการเขียนโค้ดที่ให้อาร์เรย์เรียงลำดับสองจำนวนเต็มและYคำนวณการจับคู่ค่าใช้จ่ายขั้นต่ำXY

กรณีทดสอบ

[1, 4],      [2, 10, 11]     => [[1, 2], [4, 10]]
[7, 11],     [2, 10, 11]     => [[7, 10], [11, 11]]
[7, 11, 14], [2, 10, 11, 18] => [[7, 10], [11, 11], [14, 18]]

X หรือ Y จะมีค่าซ้ำไหม?

@Mnemonic ไม่พวกเขาจะไม่
Anush

2
เพื่อความชัดเจนเราคืนการจับคู่ด้วยต้นทุนขั้นต่ำไม่ใช่ต้นทุนขั้นต่ำ
Giuseppe

1
เรามีตัวอย่างเพิ่มเติมได้ไหม
dylnan

เราสามารถสมมติว่ามีการจับคู่เพียงรายการเดียวที่มีค่าใช้จ่ายน้อยที่สุดหรือไม่
dylnan

คำตอบ:


4

Brachylogขนาด 16 ไบต์

∧≜I&pᵐz₀.-ᵐȧᵐ+I∧

ลองออนไลน์!

คำอธิบาย

∧
 ≜I                   Take an integer I = 0, 1, -1, 2, -2, 3, -3, …
   &pᵐ                Permute each sublist
      z₀.             Zip the sublists together. The result of the zip is the output
         -ᵐȧᵐ         Absolute differences of each pair
             +I       The sum of these differences must be I
               ∧

เนื่องจากเรารวมกันIเป็นจำนวนเต็มในตอนเริ่มต้นเราจึงลองทำสิ่งต่าง ๆ ตั้งแต่ค่าเล็ก ๆIไปจนถึงค่าIมากซึ่งหมายความว่าครั้งแรกที่มันจะประสบความสำเร็จจะจำเป็นสำหรับการจับคู่ที่มีความแตกต่างน้อยที่สุด


4

เยลลี่ , 15 14 12 11 ไบต์

Œ!ż€IASƊÞḢṁ

ลองออนไลน์!

  • -1 ไบต์ขอบคุณ Jonathan Allan
  • -1 ไบต์ขอบคุณ Mr. Xcoder
  • -2 ไบต์ต้องขอบคุณตัวแก้ไขที่ไม่ระบุชื่อ

YX

Œ!ż€IASƊÞḢṁ
Œ!                 All permutations of Y.
  ż€               Zip each of the permutations with X.

       ƊÞ          Sort by:
    I              Difference of each pair.
     A             Absolute value.
      S            Sum.
         Ḣ         Take the first matching.
          ṁ        Mold the result like X. Keeps only values up to the length 
                   of X which removes unpaired values from Y.

จะL}ทำงานในสถานที่ของ⁹L¤?
Mr. Xcoder

@ Mr.Xcoder ใช่ขอบคุณ!
dylnan

ÐṂḢ-> ÞḢเพื่อบันทึกไบต์
Jonathan Allan

3

Haskell, 78 77 76 ไบต์

import Data.Lists
(argmin(sum.map(abs.uncurry(-))).).(.permutations).map.zip

TIO ไม่มีData.Listsดังนั้นจึงไม่มีลิงก์

โดยทั่วไปขั้นตอนวิธีการเดียวกับที่เห็นในคำตอบของ @ dylnan

แก้ไข: -1 ไบต์ขอบคุณ @BMO



2

J , 24 ไบต์

[,.[-[:,@:(0{]#~1>])"1-/

ลองออนไลน์!

คำอธิบาย / สาธิต:

คำกริยา dyadic x f y

-/ ค้นหาความแตกต่าง

 7 11 14 -/ 2 10 11 18
 5 _3 _4 _11
 9  1  0  _7
12  4  3  _4

(0{]#~1>])"1 สำหรับแต่ละแถวจะเก็บเฉพาะค่าที่ไม่เป็นบวกและรับค่าแรก:

   7 11 14 ([:(0{]#~1>])"1-/) 2 10 11 18
_3 0 _4

[:,@: ทำให้รายการเรียบ (เพื่อให้ตรงกับรูปร่างของอาร์กิวเมนต์ซ้าย)

[-ลบขั้นต่ำ ความแตกต่างจากการโต้แย้งด้านซ้าย

    7 11 14 ([-[:,@:(0{]#~1>])"1-/) 2 10 11 18
10
11
18

[,. ต่อแถวไปทางซ้าย:

   7 11 14 ([,.[-[:,@:(0{]#~1>])"1-/) 2 10 11 18
 7 10
11 11
14 18


1

ระดับเสียงคู่ , 66 ไบต์

@(X,Y)[X;C([~,r]=min(sum(abs(X-(C=perms(Y)(:,1:numel(X)))),2)),:)]

ฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวกเตอร์แถวX, Yเป็นปัจจัยการผลิตและผลเมทริกซ์ 2 แถวที่แต่ละคอลัมน์คือคู่ของการจับคู่

ลองออนไลน์!


1

Pyth , 16 ไบต์

hosaMNCM*.pQ.cEl

ลองออนไลน์ได้ที่นี่หรือตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียวที่นี่

hosaMNCM*.pQ.cEl   Implicit: Q=evaluated 1st input, E=evaluated 2nd input
               l   Length of 1st input (trailing Q inferred)
            .cE    All combinations of 2nd input of the above length
         .pQ       All permutations of 1st input
        *          Cartesian product
      CM           Transpose each of the above
 o                 Order the above using:
   aMN               Take the absolute difference of each pair
  s                  ... and take their sum
h                  Take the first element of the sorted list, implicit print

1

MATL , 16 ไบต์

yn&Y@yy&1ZP&X<Y)

ปัจจัยการผลิตที่มีแล้วXY

การจับคู่คือเอาต์พุตที่มีค่าแรกของแต่ละคู่ (นั่นคือ, X) ในบรรทัดแรกและค่าที่สองของแต่ละคู่ในบรรทัดที่สอง

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

y       % Implicit inputs: X, Y. Duplicate from below
        % STACK: [7 11], [2 10 11], [7 11]
n       % Number of elements
        % STACK: [7 11], [2 10 11], 2
&Y@     % Variations without repetition
        % STACK: [7 11], [2 10; 2 11; 10 2; 10 11; 11 2; 11 10]
yy      % Duplicate top two elements
        % STACK: [7 11], [2 10; ...; 11 10], [7 11], [2 10; ...; 11 10]
&1ZP    % Compute cityblock distance between rows of the two input matrices
        % STACK: [7 11], [2 10;...; 11 10], [6 5 12 3 13 5]
&X<     % Argmin (first index of occurrences of the minimum)
        % STACK: [7 11], [2 10; 2 11; 10 2; 10 11; 11 2; 11 10], 4
Y)      % Row indexing. Implicit display
        % STACK: [7 11], 10 11]

1

เยลลี่ , (10?) 12 ไบต์

10 ไบต์ถ้าจำเป็นต้องใช้องค์ประกอบของ Y (ดูความคิดเห็น) - ไม่แน่ใจว่ามันได้รับอนุญาตจากสเป็คหรือไม่
ซึ่งอาจทำได้โดยการลบต่อท้าย⁸ż

Lœc@ạS¥Þ⁸Ḣ⁸ż

ลิงก์ dyadic ยอมรับ X ทางซ้ายและ Y ทางขวา
( œc⁹L¤ạS¥ÞḢż@และ 10 ไบต์œc⁹L¤ạS¥ÞḢทำเช่นเดียวกันกับ Y ทางซ้ายและ X ทางขวา)

ลองออนไลน์!

อย่างไร?

Lœc@ạS¥Þ⁸Ḣ⁸ż - Link: sorted list of integers X, sorted list of integers Y
L            - length
   @         - with swapped arguments:
 œc          -   combinations (chosen as if picked left-to-right
             -      e.g. [2,5,7,9] œc 2 -> [[2,5],[2,7],[2,9],[5,7],[5,9],[7,9]] )
        ⁸    - chain's left argument (to be on right of the following...)
       Þ     -   sort by:
      ¥      -     last two links as a dyad:
    ạ        -       absolute difference (vectorises)
     S       -       sum
         Ḣ   - head (since sorted this is just the first minimal choices from Y)
          ⁸  - chain's left argument
           ż - zip with (the chosen Y elements)

1

JavaScript (ES7), 100 ไบต์

ใหม่ที่นี่; คำแนะนำ / การแก้ไขใด ๆ ที่จะได้รับการชื่นชม! ความพยายามครั้งก่อนมองข้ามภาวะแทรกซ้อนด้วยการเรียงลำดับอาร์เรย์ที่มีNaNค่าดังนั้นหวังว่าฉันจะไม่พลาดอะไรในครั้งนี้

(x,y,q=Infinity)=>y.map((u,j)=>(p=0,s=x.map((t,i)=>(u=y[i+j],p+=(t-u)**2,[t,u])),p)<q&&(q=p,r=s))&&r

ต้องการอาร์กิวเมนต์สองตัวเป็นX , Yตามลำดับ ลองออนไลน์!

ดูเหมือนจะคล้ายกับโซลูชันของ @ Arnauld

คำอธิบาย

อาศัยความจริงที่ว่าX , Y ได้รับการจัดเรียงมีวิธีแก้ปัญหาของการจับคู่ค่าใช้จ่ายขั้นต่ำซึ่งหากคู่ทั้งหมดได้รับการจัดเรียงเพื่อรักษาลำดับองค์ประกอบของXองค์ประกอบYทั้งหมดในการจัดเรียงยังคงรักษาลำดับของพวกเขา

(x, y, q = Infinity) =>
    y.map((u, j) =>                   // iterate over indices of y
        (
            p=0,
            s=x.map((t, i) => (       // map each element of x to...
                    u = y[i+j],       // an element of y offset by j
                    p += (t-u)**2,    // accumulate the square of the difference
                    [t, u]            // new element of s
                )),
            p
        ) < q                         // if accumulated cost less than previous cost...
                                      // (if p is NaN, any comparison will return false and short circuit)
        && (q=p, r=s)                 // save cost, pair values respectively
    ) && r                            // return lowest-cost pairs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.