
- •1Введение
- •2Сортировки
- •2.1Сортировки массивов
- •2.2Сортировка простым включением
- •2.3Сортировка простым выбором
- •2.4Сортировка простым обменом
- •2.5Сравнение простых сортировок
- •2.6 Сортировка шелла
- •2.7Пирамидальная сортировка
- •2.8Быстрая сортировка
- •2.9Поиск медианы и квантилей
- •2.10Сравнение сортировок
- •3Поиск подстроки в строке
- •3.1Поиск в строке
- •3.2Простой поиск в строке
- •3.3Поиск в строке. Алгоритм боуера-мура
- •4Генерация перестановок
- •4.1Генерация перестановок последовательности натуральных чисел
- •4.2Генерация перестановок элементов в антилексикографическом порядке
- •4.3Генерация перестановок за одну транспозицию элементов
- •4.4Генерация перестановок за одну транспозицию соседних элементов
- •5Генерация подмножеств
- •5.1Генерация всех подмножеств множества
- •5.2Генерация m -элементных подмножеств множества натуральных чисел
- •Var m: integer; {Размер подмножества}
- •Var I, j, p: integer;
- •5.3Генрация k-компонентных выборок на множестве {0, 1}
- •Var k: integer; {Количество нулей в кортеже}
- •I: integer;
- •Var I, j, p: integer;
- •If Finish then Break {Exit};
- •6Генерация разбиений
- •6.1Разбиение целых чисел
- •Var I, j: integer;
- •Var j: integer;
- •Var I, j, k: integer;
- •Var d, l, Sum: integer;
- •6.2Разбиение множеств
- •/1, 2, 3/ И /4/ затем /1, 2/ и /3, 4/ и т.Д. }
- •I, j, k, r, s: integer;
- •If not Flag2 then
- •If Flag1 then
- •If Forvd[j] then { j движется вперед}
- •7Обходы бинарных деревьев
- •7.1Процедуры прохождения бинарных деревьев
- •8Поиск на бинарных деревьях
- •8.1Процедуры поиска на бинарных деревьях
- •Рекомендованная литература
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}