Модификация алгоритма кодов Грэя
От: icegood  
Дата: 01.01.09 12:38
Оценка:
Есть следующая задача: перебрать все последовательности длины 2n, состоящие из ровно n нулей и n единиц таку, чтобы две соседние отличались только перестановкой нуля и единицы неважно на каких местах (можно ещё усложнить — на местах поближе друг к другу).

Несмотря на то, что по формулировке от оригинальной задачи перебора ВСЕХ последовательностей с решением кодов Грэя данная задача мало отличается, такого простого решения, видимо, не содержит. И потом, в одной из книг по комбинаторному программированию указано, что абсолютная непригодность при малых изменениях входных условий является скорее свойсвом таких алгоритмов. И всё-таки есть надежда ещё на мировой разум...
Итак, пробовал следующее — пойдём индукцией в духе зеркальных кодов Грэя. Только при повышении n слева будем приписывать сразу две цифры — 0 и 1. Для завершения индукции ещё надо перебрать последовательности, что начинаются как 00 или 11. Для этого вводим для последовательности понятие "ранга взвешенности" — минимальное k, при котором среди 2k символов слева будет втречаться ровно k единиц и k нулей. Так что вроде "слева" нужно вести индукцию по этому самому рангу, а справа — реккурсией с кол-вом 2*(n-k). Проблема как раз в том, что сами ранги взвешенности тоже нелегко просчитать. Например, при k=7 нужно учесть вот такое: 00010011011011. Короче, кому интересно — присоединяйтесь!

P.S. (оффтоп) Единственное правило, которым не воспользовался перед написанием новых сообщений — поиск по форуму ввиду несостоятельности последнего вот уже второй день к ряду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.