У меня есть проблема с планированием ресурсов в Java, где необходимо упорядочить объекты, но есть ограничения на то, какие ресурсы могут быть рядом друг с другом. Хорошая аналогия - это строка «цифр», где рядом могут быть только определенные цифры. Мое решение было рекурсивным и прекрасно работает для небольших строк, но время выполнения равно O (X ^ N), где X - количество возможных цифр (основание), а N - длина строки. Это быстро становится неуправляемым.
Используя приведенную ниже матрицу совместимости, вот несколько примеров допустимых строк
Длина 1: 0, 1, 2, 3, 4
Длина 2: 02, 03, 14, 20, 30, 41
Длина 3: 020, 030, 141, 202, 203, 302, 303, 414
0 1 2 3 4
---------------------
0| 0 0 1 1 0
1| 0 0 0 0 1
2| 1 0 0 0 0
3| 1 0 0 0 0
4| 0 1 0 0 0
Мое решение для подсчета всех строк длины N было начать с пустой строки, переставить первую цифру и сделать рекурсивный вызов для всех строк длины N-1. Рекурсивные вызовы проверяют последнюю добавленную цифру и пробуют все перестановки, которые могут быть рядом с этой цифрой. Были сделаны некоторые оптимизации, чтобы я не пытался переставлять 00, 01, 04 каждый раз, например - только 02, 03, но производительность все еще остается низкой, поскольку он масштабируется от базовой 5 (пример) до базовой 4000.
Есть какие-нибудь мысли о лучшем способе подсчета перестановок, кроме попыток перечислить их все?