Коды Грея для перестановок — различия между версиями
Niko (обсуждение | вклад) |
Niko (обсуждение | вклад) |
||
| Строка 39: | Строка 39: | ||
1 2 4 3 | 1 2 4 3 | ||
|} | |} | ||
| + | == '''Определение''' == | ||
| + | |||
'''Коды Грея для перестановок''' - называют такое упорядочение перестановок, что соседние перестановки отличаются только элементарной транспозицией. | '''Коды Грея для перестановок''' - называют такое упорядочение перестановок, что соседние перестановки отличаются только элементарной транспозицией. | ||
| + | |||
| + | == '''Построения Кода Грея для перестановок на Pascal''' == | ||
| + | for i := 1 to n do | ||
| + | begin | ||
| + | P[i] := i; | ||
| + | C[i] := 1; | ||
| + | PR[i] := true; | ||
| + | end; | ||
| + | C[n] := 0; | ||
| + | for g := 1 to n do | ||
| + | write(P[g], ' '); | ||
| + | writeln; | ||
| + | i := 1; | ||
| + | while i < n do | ||
| + | begin | ||
| + | i := 1; | ||
| + | x := 0; | ||
| + | while C[i] = n - i + 1 do | ||
| + | begin | ||
| + | PR[i] := not PR[i]; | ||
| + | C[i] := 1; | ||
| + | if PR[i] then x := x + 1; | ||
| + | i := i + 1; | ||
| + | end; | ||
| + | if i < n then | ||
| + | begin | ||
| + | if PR[i] then k := C[i] + x | ||
| + | else k := n - i + 1 - C[i] + x; | ||
| + | swap(P[k], P[k + 1]); | ||
| + | for g := 1 to n do | ||
| + | write(P[g], ' '); | ||
| + | writeln; | ||
| + | C[i] := C[i] + 1 | ||
| + | end; | ||
| + | end; | ||
Версия 09:17, 3 декабря 2010
код Грея для перестановки при n = 2
1 2 2 1 |
код Грея для перестановки при n = 3
1 2 3 2 1 3 2 3 1 3 2 1 3 1 2 1 3 2 |
код Грея для перестановки при n = 4
1 2 3 4 2 1 3 4 2 3 1 4 2 3 4 1 3 2 4 1 3 2 1 4 3 1 2 4 1 3 2 4 1 3 4 2 3 1 4 2 3 4 1 2 3 4 2 1 4 3 2 1 4 3 1 2 4 1 3 2 1 4 3 2 1 4 2 3 4 1 2 3 4 2 1 3 4 2 3 1 2 4 3 1 2 4 1 3 2 1 4 3 1 2 4 3 |
Определение
Коды Грея для перестановок - называют такое упорядочение перестановок, что соседние перестановки отличаются только элементарной транспозицией.
Построения Кода Грея для перестановок на Pascal
for i := 1 to n do
begin
P[i] := i;
C[i] := 1;
PR[i] := true;
end;
C[n] := 0;
for g := 1 to n do
write(P[g], ' ');
writeln;
i := 1;
while i < n do
begin
i := 1;
x := 0;
while C[i] = n - i + 1 do
begin
PR[i] := not PR[i];
C[i] := 1;
if PR[i] then x := x + 1;
i := i + 1;
end;
if i < n then
begin
if PR[i] then k := C[i] + x
else k := n - i + 1 - C[i] + x;
swap(P[k], P[k + 1]);
for g := 1 to n do
write(P[g], ' ');
writeln;
C[i] := C[i] + 1
end;
end;