Монотонный код Грея — различия между версиями
Gpevnev (обсуждение | вклад) |
Gpevnev (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
{{Определение | {{Определение | ||
|definition = | |definition = | ||
| − | '''Монотонный код Грея''' (англ. ''Monotonic Gray Code'') {{---}} способ построения кода Грея, | + | '''Монотонный код Грея''' (англ. ''Monotonic Gray Code'') {{---}} способ построения кода Грея, при котором <tex>\nexists</tex> <tex>g_i, g_j</tex>, что <tex>g_i</tex> содержит на <tex>2</tex> или больше единиц, чем <tex>g_j</tex>. |
}} | }} | ||
| − | Монотонный код Грея | + | Монотонный код Грея преимущественно используется в теории связанных сетей, например для минимизации ожидания линейным массивом процессоров. |
== Алгоритм построения == | == Алгоритм построения == | ||
| Строка 141: | Строка 141: | ||
[[Категория: Дискретная математика и алгоритмы]] | [[Категория: Дискретная математика и алгоритмы]] | ||
[[Категория: Комбинаторика]] | [[Категория: Комбинаторика]] | ||
| − | |||
| − | |||
Версия 18:03, 6 декабря 2016
| Определение: |
| Монотонный код Грея (англ. Monotonic Gray Code) — способ построения кода Грея, при котором , что содержит на или больше единиц, чем . |
Монотонный код Грея преимущественно используется в теории связанных сетей, например для минимизации ожидания линейным массивом процессоров.
Содержание
Алгоритм построения
Для начала определим такое понятие, как вес двоичного кода, им будет являтся количество в данном двоичном коде. Очевидно, что нельзя построить код Грея в котором бы вес всегда возрастал. Неплохим решением этой проблемы будет обход всех кодов со смежными с данным весами.
Мы можем формализовать модель монотонных кодов Грея рассматривая разбиение гиперкуба , вершины в котором являются двоичными кодами, на уровни с одинаковым весом вершин.
для . Для всех уровней выполняется соотношение .
Пусть подграф , который является обединением двух смежных уровней, т. е. , и пусть множество граней . Тогда монотонным кодом Грея будет являтся Гамильтонов путь в , при котором любой идет перед , то .
Ниже на катринке Гамильтонов путь в гиперкубе для , построенный по алгоритму Саважа-Винклера(англ. Savage-Winkler).
Элегантная идея построения -ичного монотонного кода Грея состоит в том, чтобы рекурсивно строить подпути длинны включающих вершины .
Определим и , когда или и .
Здесь это определенная перестановка элементов множества к которому она применена, а это путь к котрому была применена пересатновка . Существует два варианта построить моготонный код грея по путям .
Назовем их и . Будем строить их таким образом:
Выбор перестановки обусловлен тем, чтобы получившиеся коды соответсвовали требованиям кода Грея и поэтому эта перестановка равна .
Чтобы лучше разобратся в том, как сторится этот код и работает перестановка следует рассмотреть таблицу ниже.
Монотонный код Грея может быть эффективно сгенерирован по этому алгоритму за время . Легче всего написать этот алгоритм используя сопрограмму.
Псевдокод
|
return x[-n:] + x[:-n] pi(n): if n <= 1:
return (0,)
x = pi(n - 1) + (n - 1,)
return rotate_right(tuple(x[k] for k in x), 1)
p(n, j, reverse=False): if n == 1 and j == 0:
if not reverse:
yield (0,)
yield (1,)
else:
yield (1,)
yield (0,)
elif j >= 0 and j < n:
perm = pi(n - 1)
if not reverse:
for x in p(n - 1, j - 1):
yield (1,) + tuple(x[k] for k in perm)
for x in p(n - 1, j):
yield (0,) + x
else:
for x in p(n - 1, j, reverse=True):
yield (0,) + x
for x in p(n - 1, j - 1, reverse=True):
yield (1,) + tuple(x[k] for k in perm)
monotonic(n): for i in range(n):
for x in (p(n, i) if i % 2 == 0 else p(n, i, reverse=True)):
yield x
|
Визуализация работы алгоритма
Для
Для
См. Также
Примечания


