Как выбрать конкретный элемент из декартова произведения, не вычисляя все остальные элементы

Я в основном убежден, что есть ответ на эту проблему, но хоть убей, не могу понять, как это сделать.

Допустим, у меня есть три набора:

A = [ 'foo', 'bar', 'baz', 'bah' ]
B = [ 'wibble', 'wobble', 'weeble' ]
C = [ 'nip', 'nop' ]

И я знаю, как вычислить декартово/перекрестное произведение, (и это описано повсюду, на этом сайте и в других местах), так что я не буду повторяться. что здесь.

Я ищу алгоритм, который позволил бы мне просто выбрать конкретный элемент из декартова произведения без создания всего набора или итерации, пока я не достигну n-го элемента.

Конечно, я мог бы легко выполнить итерацию для небольшого набора примеров, подобного этому, но код, над которым я работаю, будет работать с гораздо большими наборами.

Поэтому я ищу функцию, назовем ее 'CP', где:

CP(1) == [ 'foo', 'wibble', 'nip' ]
CP(2) == [ 'foo', 'wibble', 'nop' ]
CP(3) == [ 'foo', 'wobble', 'nip' ]
CP(4) == [ 'foo', 'wobble', 'nop' ]
CP(5) == [ 'foo', 'weeble', 'nip' ]
CP(6) == [ 'foo', 'weeble', 'nop' ]
CP(7) == [ 'bar', 'wibble', 'nip' ]
...
CP(22) == [ 'bah', 'weeble', 'nop' ]
CP(23) == [ 'bah', 'wobble', 'nip' ]
CP(24) == [ 'bah', 'wobble', 'nop' ]

И ответ выдается за O(1)время, более или менее.

Я следил за идеей, что это должно быть возможно, (черт возьми, даже просто! ), чтобы вычислить индексы элементов из A, B, C, которые мне нужны, а затем просто вернуть их из исходных массивов, но мои попытки сделать эту работу правильно пока не сработали.

Я пишу код на Perl, но могу легко портировать решение с Python, JavaScript или Java (и, возможно, с некоторых других)

16
задан David Nehme 30 March 2012 в 14:33
поделиться