LINUX.ORG.RU

Подскажите название алгоритма

 


1

1

Есть N массивов, нужно создать все возможные варианты пар из значений массивов.

Пример для двух массивов по 2 числа:

const numbers1 = [1, 2];
const numbers2 = [4, 5];
// makeMagick(numbers1, numbers2) -> [[1,4],[1,5],[2,4],[2,5]]

UPD: Я вообще зачем создал тему - вроде видел красивое решение, но ни как не могу нагуглить. Думаю, что если у этого алгоритма есть название, то поиски будут проще.

Deleted

Последнее исправление: Bizun (всего исправлений: 1)

ну как вариант Алгоритм Нарайаны

Silerus ★★★★
()

А для трёх массивов как? Так?

const numbers1 = [1, 2];
const numbers2 = [4, 5];
const numbers3 = [7, 8];

// makeMagick(numbers1, numbers2, numbers3) ->
// [[1,4],[1,5],
//  [2,4],[2,5],
//  [1,7],[1,8],
//  [2,7],[2,8],
//  [4,7],[4,8],
//  [5,7],[5,8]]
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Увы, для трех нет примера.

Но что-то мне подсказывает, что вот так:

const numbers1 = [1, 2];
const numbers2 = [4, 5];
const numbers3 = [7, 8];

// makeMagick(numbers1, numbers2, numbers3) ->
// [[1,4,7],
//  [1,4,8],
//  [1,5,7],
//  [1,5,8],
//  ...
// ]

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Deleted

Тебе что, на Python? Тогда [p + s for p in 'ABCD' for s in 'xy'].

t184256 ★★★★★
()

Эта операция называется декартово (или прямое) произведение множеств.

aquadon ★★★★★
()
Ответ на: комментарий от Deleted

Тогда это обычный счёт. Индексы:

[0,0,0]
[0,0,1]
[0,0,2]
[0,1,0]
[0,1,1]
...

Т.е. прибавляем 1 к крайнему правому элементу и, если получаем индекс больше максимального, ставим 0 и прибавляем к элементу слева от него и т.д.

xaizek ★★★★★
()

Cartesian product

вроде видел красивое решение, но ни как не могу нагуглить

[troll-mode] Просто используй Хаскиль:

> let x = [1, 2]
> let y = [3, 4]
> let z = [5, 6]
> print $ (,) <$> x <*> y
[(1,3),(1,4),(2,3),(2,4)]
> print $ (,,) <$> x <*> y <*> z
[(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)]

Или для произвольного случая (N списков):

sequence [x, y, z, x]
=> [[1,3,5,1],[1,3,5,2],[1,3,6,1],[1,3,6,2],[1,4,5,1],[1,4,5,2],[1,4,6,1],[1,4,6,2],[2,3,5,1],[2,3,5,2],[2,3,6,1],[2,3,6,2],[2,4,5,1],[2,4,5,2],[2,4,6,1],[2,4,6,2]]

[/troll-mode]

theNamelessOne ★★★★★
()

Уже как 2 вложенных цикла сделать идут спрашивать на лор

deadplace
()
numbers1.reduce((a, b) => (a.push(...numbers2.map(c => [b, c])), a), [])
tz4678 ★★
()

у тебя в примере не все возможные значения, это так и должно быть? или [4, 1] и [1, 4] это одно и тоже? порядок не играет роли?

Int0l ★★
()
Последнее исправление: Int0l (всего исправлений: 2)

В итоге нужно универсальное решение для любого количества массивов, каждый из которых любой длины?

И да, как ранее заметили, порядок чисел из массивов не важен?

HIS
()

cartesian product, функция prоduсt в xаcкeллe

anonymous
()
bash$ echo {1,2}:{4,5}
1:4 1:5 2:4 2:5

А вообще для произвольного числа массивов это делается через рекурсию

AntonI ★★★★
()
Ответ на: комментарий от xaizek

когда не важен порядок (взаимный) генерации - то есть алго обходящий все номера переключая не более двух разрядов и даже не более чем на единицу

anonymous
()
Ответ на: комментарий от anonymous

ТС сам толком не знает, что ему нужно (для трех списков нет примера). А код Грея ещё непоняток добавит.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.