Найти минимальную стоимость соответствия между массивами целых чисел

12

Рассмотрим два отсортированных массива целых чисел и Y размера m и n соответственно с m < 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) . Если бы мы сделали пары ( 7 , 11 ) , ( 11 , 10 ), стоимость была бы 4 + 1 = 5 .3+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 повторяющиеся значения?
@ Мнемоник Нет, они не будут
Ануш
2
Чтобы было понятно, мы возвращаем соответствие с минимальной стоимостью, а не с минимальной стоимостью.
Джузеппе
1
Можем ли мы иметь больше примеров?
Дилнан
Можем ли мы предположить, что существует только одно сопоставление с минимальной стоимостью?
Дилнан

Ответы:

4

Брахилог , 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, что означает, что первый раз, когда это удастся, обязательно будет для спаривания с наименьшими абсолютными различиями.

Fatalize
источник
4

Желе , 15 14 12 11 байт

Œ!ż€IASƊÞḢṁ

Попробуйте онлайн!

  • -1 байт благодаря Джонатану Аллану
  • -1 байт благодаря мистеру Xcoder
  • -2 байта благодаря анонимному редактору

Грубая сила. Принимает входные данные как затем 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.
dylnan
источник
Будет L}работать на месте ⁹L¤?
г-н Xcoder
@ Mr.Xcoder Да, спасибо!
Дилнан
ÐṂḢ-> ÞḢчтобы сохранить байт.
Джонатан Аллан
3

Haskell, 78 77 76 байтов

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

TIO не имеет Data.Lists, поэтому нет ссылки.

В основном тот же алгоритм, что и в ответе @ dylnan .

Редактировать: -1 байт благодаря @BMO.

Ними
источник
2

JavaScript (ES7), 121 байт

Принимает 2 массива в синтаксисе карри (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

Попробуйте онлайн!

Arnauld
источник
2

J , 24 байта

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

Попробуйте онлайн!

Объяснение / Демонстрация:

Диадический глагол, 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)),:)]

Функция Anonymous , которая принимает векторы - строки 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
Sok
источник
1

MATL , 16 байт

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

Входы есть X, тогда Y.

Сопоставление выводится с первыми значениями каждой пары (то есть 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¥Þ⁸Ḣ⁸ż

Диадическая ссылка, принимающая 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's

объяснение

Полагается на тот факт, что с учетом сортировки 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
избыточность
источник