Небрутовый подход к генерации всех кортежей из декартовых произведений, которые различаются по крайней мере в k местах - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно создать кортежи из декартового произведения из нескольких списков по несколько десятков элементов в каждом (хотя длина списков может быть разной), а затем снова отфильтровать их, поэтому у меня останутся только кортежи, отличные друг от друга по крайней мере k мест. Это имеет время выполнения O(10^n). Я пытался в течение нескольких часов найти подход, который был бы более сложным по времени. Возможно, есть какое-то умное числовое решение.

Например, если все списки имеют ровно 10 элементов, вы можете сгенерировать возможный набор всех кортежей, которые отличаются в двух местах, сначала преобразовав кортежи индексов списка в числа и затем многократно вычитая 11. Например, если у нас есть 3 списка, наборы индексов списка варьируются от (0,0,0) до (9,9,9). С помощью этих кортежей вы можете затем индексировать свои исходные списки, чтобы получить фактические кортежи декартового произведения, которые вы хотите построить.

Таким образом, различные кортежи f(999 - 11 * 1) = (8,8,8), f(999 - 11 * 2) = (8,7,6), f(999 - 11 * 3) = (8,6,5) и так далее. Это должно работать для любой базы, если все списки имеют одинаковое количество элементов.

Но когда у нас есть списки, подобные ['a','b','c'], ['a','b'], ['a','b','c','d'], действительные числа не охватывают весь диапазон базы 4 (самый длинный список в этом примере): 223 не является допустимым номером кодировки индексов, поскольку индекс 2 находится вне диапазона для среднего списка.

Итак, кто-нибудь знает хитрый прием для этого?

Я делаю это в Python, но язык на самом деле не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...