Учитывая два комплекта и т.д .:Перечисляя декартово произведение, минимизируя повторение
{A B C}, {1 2 3 4 5 6}
Я хочу, чтобы сгенерировать декартово произведение в порядке, который помещает столько места, сколько возможно между равными элементами. Например, [A1, A2, A3, A4, A5, A6, B1…]
не годится, потому что все A
s находятся рядом друг с другом. Приемлемое решение будет идти «вниз по диагонали», а затем каждый раз, когда он оборачивает компенсируя один, например:
[A1, B2, C3, A4, B5, C6, A2, B3, C4, A5, B6, C1, A3…]
Выраженный визуально:
| | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C | A | B | C |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | | | | | | | | | | | | | | | | | |
| 2 | | 2 | | | | | | | | | | | | | | | | |
| 3 | | | 3 | | | | | | | | | | | | | | | |
| 4 | | | | 4 | | | | | | | | | | | | | | |
| 5 | | | | | 5 | | | | | | | | | | | | | |
| 6 | | | | | | 6 | | | | | | | | | | | | |
| 1 | | | | | | | | | | | | | | | | | | |
| 2 | | | | | | | 7 | | | | | | | | | | | |
| 3 | | | | | | | | 8 | | | | | | | | | | |
| 4 | | | | | | | | | 9 | | | | | | | | | |
| 5 | | | | | | | | | | 10| | | | | | | | |
| 6 | | | | | | | | | | | 11| | | | | | | |
| 1 | | | | | | | | | | | | 12| | | | | | |
| 2 | | | | | | | | | | | | | | | | | | |
| 3 | | | | | | | | | | | | | 13| | | | | |
| 4 | | | | | | | | | | | | | | 14| | | | |
| 5 | | | | | | | | | | | | | | | 15| | | |
| 6 | | | | | | | | | | | | | | | | 16| | |
| 1 | | | | | | | | | | | | | | | | | 17| |
| 2 | | | | | | | | | | | | | | | | | | 18|
или, что то же самое, но без повторения строк/столбцов :
| | A | B | C |
|---|----|----|----|
| 1 | 1 | 17 | 15 |
| 2 | 4 | 2 | 18 |
| 3 | 7 | 5 | 3 |
| 4 | 10 | 8 | 6 |
| 5 | 13 | 11 | 9 |
| 6 | 16 | 14 | 12 |
Я полагаю, что есть и другие решения, но об этом мне было легче всего думать. Но я ударяю головой о стену, пытаясь понять, как выражать ее в общем случае - это удобная вещь, когда мощность двух наборов кратно друг другу, но я хочу, чтобы алгоритм выполнял The Right Thing для множеств например, размер 5 и 7. Или размер 12 и 69 (это настоящий пример!).
Существуют ли для этого установленные алгоритмы? Я продолжаю отвлекаться от мысли о том, как рациональные числа отображаются на множество натуральных чисел (чтобы доказать, что они являются счетными), но путь, который он принимает через ℕ × ℕ, не работает для этого случая.
Так получилось, что приложение написано на Ruby, но меня не интересует язык. Pseudocode, Ruby, Python, Java, Clojure, Javascript, CL, абзац на английском языке - выберите ваш любимый.
проверка концепции решения в Python (скоро будет портирован на Ruby, и соединился с Rails):
import sys
letters = sys.argv[1]
MAX_NUM = 6
letter_pos = 0
for i in xrange(MAX_NUM):
for j in xrange(len(letters)):
num = ((i + j) % MAX_NUM) + 1
symbol = letters[letter_pos % len(letters)]
print "[%s %s]"%(symbol, num)
letter_pos += 1
Если кардинальность не являются кратными все, что происходит в том, что она занимает больше времени, чтобы обернуть - например, A1 B2 C3 D1 A2 B3 C1 D2 A3 B1 C2 D3. Если два числа взаимно просты, они не обертываются, пока вы не охватите весь набор. Итак, все, что вам нужно сделать, это подождать, пока произойдет обертка, а затем найдите символ, который еще не был покрыт. – mcdowella
Это очень похоже на домашнее задание на линейную алгебру. Я думаю, вы неправильно объясняете проблему. Сделайте шаг назад и прочитайте свой материал курса.Должно быть очевидно, в чем проблема. – starmole
Это не домашнее задание. Приложение - приложение для тренировки в Rails, которое я делаю как хобби; основная идея состоит в том, что если у вас есть шесть типов упражнений ab, которые могут выполняться прямо, слева или справа, есть 18 полных упражнений, но вы не хотите делать все это каждый день, только 5 раз в день вы не хотите, чтобы все они были на одной стороне тела. Таким образом, приложение выяснит все комбинации, а затем представит разумный порядок, чтобы сделать их. Я просто не хотел загрязнять этот вопрос с помощью схемы БД, и поэтому - мой основной вопрос - об алгоритме. – tsm