Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.14 Mб
Скачать

4Генерация перестановок

Пусть задано некоторое множество элементов

a1 a2 a3 … an

Возникает вопрос. Сколькими способами можно разместить элементы этого множества так, чтобы в любой паре размещений хотя бы в одной позиции эти элементы отличались друг от друга. Например, для множества из трех элементов некоторая пара размещений может иметь вид:

a1 a2 a3

a2 a3 a1

Размещения реализуются путем перестановки их элементов. Можно легко подсчитать количество возможных перестановок элементов множества. Если на первом месте в перестановке может стоять один из n элементов, то на втором месте один из n-1 элементов, на третьем месте один из n-2 элементов и т.д., то общее количество перестановок равно

n * (n-1) * (n-2) * … *1 = n!

Таким образом, общее количество перестановок равно n!

Существует множество алгоритмов получения перестановок. Все они построены по принципу сдвига элементов заданной последовательности. Ниже рассматриваются некоторые из этих алгоритмов.

4.1Генерация перестановок последовательности натуральных чисел

Первоначально рассмотрим очень наглядный алгоритм получения всех перестановок последовательности натуральных чисел в диапазоне от 1 до n.

Здесь новая перестановка получается из предыдущей перестановки путем вращения всей или части последовательности заданных чисел.

Пусть задана последовательность из 10 элементов

1 2 3 4 5 6 7 8 9 10

После первого вращения получим

10 1 2 3 4 5 6 7 8 9

После второго вращения получим

9 10 1 2 3 4 5 6 7 8

и так далее, пока число 10 вновь не окажется на позиции 10 т.е. получим

1 2 3 4 5 6 7 8 9 10

Однако такая последовательность уже была. Тогда выполняется вращение среди первых 9 элементов. Получим:

9 1 2 3 4 5 6 7 8 10

и вновь выполняется вращение всех 10 элементов.

Теперь каждый раз, когда на позиции 10 окажется элемент 10 необходимо выполнить вращение среди 9 элементов. Но и здесь после некоторого числа вращений на позиции 9 окажется число 9, что свидетельствует о повторении последовательности. Но тогда выполняется вращение среди 8 элементов, после чего весь процесс повторяется заново.

Так происходит до тех пор, пока не будет выполнено вращение среди элементов 1 и 2.

2 1 3 4 5 6 7 8 9 10

После этого весь процесс повторяется заново до тех пор, пока вновь на позиции 2 не встретится элемент 2. Это признак окончания процесса генерации всех перестановок.

Ниже приводится текст программы Permutation1 генерации всех перестановок из последовательности натуральных чисел

1, 2, 3, ..., N-1, N

Контроль необходимости вращения более короткой последовательности чисел выполняется проверкой условия A[m] = m.

program Permutation1; {Генерирует все перестановки из последовательности натуральных чисел 1, 2, 3, ..., N-1, N}

uses crt;

const N = 4;

var

J: integer;

Arr: array [1..N] of integer;

procedure Shift (M: integer);{Выполняет вращение последовательности из m заданных чисел}

var J, Work: integer;

begin

Work := Arr[1];

for J := 1 to M-1 do

Arr[J] := Arr[J+1];

Arr[M] := Work;

end; {Shift}

procedure ControlShift; {Выполняет вращения последовательности чисел}

var J, M, Work: integer;

begin

M := N;

while true do

begin

Shift (M);

if Arr[M] <> M then

begin

for J := 1 to N do Write (Arr[J], ' '); {печать очередной перестановки}

Writeln;

M := N;

end

else

if M = 2

then Break

else M := M-1;

end;

for J := 1 to N do Write (Arr[J], ' '); {печать последней (исходной) перестановки}

end; {ControlShift}

begin

Clrscr;

for I := 1 to N do Arr [I] := I;

ControlShift;

end. {Permutation1}