Tìm kết quả khớp chi phí tối thiểu giữa các mảng số nguyên


12

Xét hai mảng số nguyên XY có kích thước và tương ứng với . Ví dụ , .n m < n X = ( 1 , 4 ) Y = ( 2 , 10 , 11 )mnm<nX= =(1,4)Y=(2,10,11)

Chúng ta nói rằng một kết hợp là một số cách để ghép nối mỗi phần tử của với một phần tử của theo cách như vậy mà không có hai yếu tố của được ghép nối với cùng một nguyên tố của . Chi phí của một kết hợp chỉ là tổng của các giá trị tuyệt đối của sự khác biệt trong các cặp.Y X YXYXY

Ví dụ: với , chúng ta có thể tạo các cặp mà sau đó có chi phí . Nếu chúng ta đã thực hiện các cặp , chi phí sẽ là . Nếu chúng ta đã thực hiện các cặp , chi phí sẽ là .Y = ( 2 , 10 , 11 ) ( 7 , 2 ) , ( 11 , 10 ) 5 + 1 = 6 ( 7 , 10 ) , ( 11 , 11 ) 3 + 0 = 3 ( 7 , 11 ) , ( 11 , 10 ) 4X=(7,11)Y=(2,10,11)(7,2),(11,10)5+1=6(7,10),(11,11)3+0=3(7,11),(11,10)4+1=5

Một ví dụ khác lấy , . Chúng ta có thể tạo các cặp với chi phí là . Các cặp giá .Y = ( 2 , 10 , 11 , 18 ) ( 7 , 2 ) , ( 11 , 10 ) , ( 14 , 11 ) 9 ( 7 , 10 ) , ( 11 , 11 ) , ( 14 , 18 ) 7X=(7,11,14)Y=(2,10,11,18)(7,2),(11,10),(14,11)9(7,10),(11,11),(14,18)7

Nhiệm vụ là viết mã, đưa ra hai mảng số nguyên và được sắp xếp , tính toán khớp giá tối thiểu.YXY

Các trường hợp thử nghiệm

[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 hoặc Y sẽ bao giờ có giá trị lặp lại?

@Mnemonic Không họ sẽ không
Anush

2
Để rõ ràng, chúng tôi trả lại kết quả khớp với chi phí tối thiểu, không phải chi phí tối thiểu.
Giuseppe

1
Chúng ta có thể có nhiều ví dụ hơn?
dylnan

Chúng ta có thể cho rằng chỉ có một kết hợp có chi phí tối thiểu?
dylnan

Câu trả lời:


4

Brachylog , 16 byte

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

Hãy thử trực tuyến!

Giải trình

∧
 ≜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
               ∧

Vì chúng tôi hợp nhất Ivới một số nguyên ngay từ đầu, chúng tôi thử mọi thứ từ giá trị nhỏ Iđến giá trị lớn I, điều đó có nghĩa là lần đầu tiên nó sẽ thành công nhất thiết phải được ghép nối với sự khác biệt nhỏ nhất tuyệt đối.


4

Thạch , 15 14 12 11 byte

Œ!ż€IASƊÞḢṁ

Hãy thử trực tuyến!

  • -1 byte nhờ Jonathan Allan
  • -1 byte nhờ ông Xcoder
  • -2 byte nhờ một trình soạn thảo ẩn danh

Lực lượng vũ phu. Đưa đầu vào như thì X .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.

Sẽ L}làm việc thay ⁹L¤thế?
Ông Xcoder

@ Mr.Xcoder Vâng, cảm ơn!
dylnan

ÐṂḢ-> ÞḢđể lưu một byte.
Jonathan Allan

3

Haskell, 78 77 76 byte

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

TIO không có Data.Lists, vì vậy không có liên kết.

Về cơ bản thuật toán tương tự như đã thấy trong câu trả lời của @ dylnan .

Chỉnh sửa: -1 byte nhờ @BMO.


2

JavaScript (ES7), 121 byte

Lấy 2 mảng theo cú pháp currying (x)(y).

x=>y=>(m=P=(b,[x,...a],s=0,o=[])=>1/x?b.map((v,i)=>P(b.filter(_=>i--),a,s+(x-v)**2,[[x,v],...o])):m<s||(r=o,m=s))(y,x)&&r

Hãy thử trực tuyến!


2

J , 24 byte

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

Hãy thử trực tuyến!

Giải thích / Trình diễn:

Một động từ dyadic, x f y

-/ tìm thấy sự khác biệt

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

(0{]#~1>])"1 đối với mỗi hàng chỉ giữ các giá trị không dương và lấy giá trị đầu tiên:

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

[:,@: làm phẳng danh sách (để khớp với hình dạng của đối số bên trái)

[-trừ đi số phút sự khác biệt từ đối số bên trái

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

[,. khâu chúng vào đối số bên trái:

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


1

Octave , 66 byte

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

Hàm ẩn danh lấy vectơ hàng X, Ylàm đầu vào và đầu ra ma trận 2 hàng trong đó mỗi cột là một cặp khớp.

Hãy thử trực tuyến!


1

Bình thường , 16 byte

hosaMNCM*.pQ.cEl

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

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 byte

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

Đầu vào là X, sau đó Y.

Sự phù hợp là đầu ra với các giá trị đầu tiên của mỗi cặp (nghĩa là X) trong dòng đầu tiên và các giá trị thứ hai của mỗi cặp trong dòng thứ hai.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

Jelly , (10?) 12 byte

10 byte nếu chỉ yêu cầu các yếu tố của Y (xem bình luận) - không chắc là nó có được thông số kỹ thuật hay không (và có lẽ không nên vì các câu trả lời khác đã thực hiện chi tiết này).
Điều này có thể đạt được bằng cách loại bỏ dấu⁸ż .

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

Một liên kết dyadic chấp nhận X ở bên trái và Y ở bên phải.
( œc⁹L¤ạS¥ÞḢż@và 10 byte œc⁹L¤ạS¥ÞḢlàm tương tự với Y ở bên trái và X ở bên phải).

Hãy thử trực tuyến!

Làm sao?

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 byte

Mới ở đây; bất kỳ lời khuyên / chỉnh sửa sẽ được đánh giá cao! Một nỗ lực trước đó đã bỏ qua các phức tạp với việc sắp xếp một mảng có chứa một NaNgiá trị, vì vậy hy vọng tôi đã không bỏ lỡ bất cứ điều gì lần này.

(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

Yêu cầu hai đối số lần lượt là X , Y. Hãy thử trực tuyến!

Xuất hiện tương tự như giải pháp của @ Arnauld

Giải trình

Dựa vào thực tế là X , Y đã được sắp xếp, tồn tại một giải pháp khớp chi phí tối thiểu trong đó nếu tất cả các cặp được sắp xếp để bảo toàn thứ tự các phần tử của X , tất cả các phần tử Y trong sắp xếp cũng giữ nguyên thứ tự của chúng.

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.