Участник:ZeRoGerc — различия между версиями
ZeRoGerc (обсуждение | вклад) (→Пример работы алгоритма) |
ZeRoGerc (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
== Идея == | == Идея == | ||
− | Сопоставим каждому элементу перестановки <tex>p[i]</tex> направление <tex>d[i]</tex>. Будем указывать направление при помощи стрелок '''←''' ("влево") или '''→'''("вправо"). Назовём элемент подвижным, если по направлению стелки стоит элемент меньше его. Например для <tex>p | + | Сопоставим каждому элементу перестановки <tex>p[i]</tex> направление <tex>d[i]</tex>. Будем указывать направление при помощи стрелок '''←''' ("влево") или '''→'''("вправо"). Назовём элемент подвижным, если по направлению стелки стоит элемент меньше его. Например для <tex> p = \{1, 3, 2, 4, 5\},\;d = \{</tex>←, →, ←, →, ←<tex>\}</tex>, подвижными являются элементы 3 и 5. На каждой итерации алгоритма будем искать наибольший подвижный элемент и менять местами с элементом, который стоит по направлению стрелки. После чего поменяем направление стрелок на противоположное у всех элементов больших текущего.Изначально <tex> p = \{1, ... ,n\},\;d = \{</tex>←, ... ,←<tex>\}</tex> |
− | == Пример работы алгоритма == | + | |
− | + | == Пример работы алгоритма для n = 3 == | |
*<tex> p = \{1, 2, \textbf{3}\}\;\;\;d = \{</tex>←, ←, ←<tex>\}</tex> | *<tex> p = \{1, 2, \textbf{3}\}\;\;\;d = \{</tex>←, ←, ←<tex>\}</tex> | ||
*<tex> p = \{1, \textbf{3}, 2\}\;\;\;d = \{</tex>←, ←, ←<tex>\}</tex> | *<tex> p = \{1, \textbf{3}, 2\}\;\;\;d = \{</tex>←, ←, ←<tex>\}</tex> |
Версия 23:15, 27 ноября 2014
Алгоритм Джонсона-Троттера(англ. Johnson-Trotter algorithm) - алгоритм генерации всех перестановок из
элементов. Причём любая перестановка отличаются от предыдущей транспозицией двух соседних элементов.Идея
Сопоставим каждому элементу перестановки
направление . Будем указывать направление при помощи стрелок ← ("влево") или →("вправо"). Назовём элемент подвижным, если по направлению стелки стоит элемент меньше его. Например для ←, →, ←, →, ← , подвижными являются элементы 3 и 5. На каждой итерации алгоритма будем искать наибольший подвижный элемент и менять местами с элементом, который стоит по направлению стрелки. После чего поменяем направление стрелок на противоположное у всех элементов больших текущего.Изначально ←, ... ,←Пример работы алгоритма для n = 3
- ←, ←, ←
- ←, ←, ←
- ←, ←, ←
- →, ←, ←
- ←, →, ←
- ←, ←, →