
- •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Процедуры поиска на бинарных деревьях
- •Рекомендованная литература
/1, 2, 3/ И /4/ затем /1, 2/ и /3, 4/ и т.Д. }
uses crt;
const N = 4;
type
TArr = array [1..N] of integer;
var
I, j, k, r, s: integer;
Flag1, Flag2: boolean; {Флаги - используются для управления выводом на экран}
Block: TArr; { Block[I] - номер блока, содержащего элемент I}
Next: TArr; {Next[I] - номер следующего блока для блока с номером I}
Prev: TArr; {Prev[I] - номер предыдущего блока для блока с номером I}
Forvd: array [1..N] of boolean; {Направление, в котором "движется" активный элемент I. При true – движение вправо, а при false - движение влево}
procedure Output1; {Вывод разбиения}
begin
Flag1 := false;
Write ('Разбиение ');
for R := 1 to N do
begin
Flag2 := false;
for I := 1 to N do
if Block[I] = R then
begin
If not Flag2 then
begin
Write ('{', I);
Flag2 := true;
Flag1 := true;
end
else
Write (' ', I);
end;
If Flag1 then
begin
Write ('} ');
Flag1 := false;
end;
end;
Writeln;
end; {Output1}
procedure Output2; {Вывод вспомогательных массивов и разбиения}
begin
writeln;
Write ('Block: ');
for R := 1 to N do
Write (Block[R], ' ');
Writeln;
Write ('Next: ');
for R := 1 to N do
Write (Next[R], ' ');
Writeln;
Write ('Prev: ');
for R := 1 to N do
Write (Prev[R], ' ');
Writeln;
Write ('Forv: ');
for R := 1 to N do
Write (Forvd[R], ' ');
Writeln;
Output1;
end; {Output2}
begin
Clrscr;
for I := 1 to N do {Занесение I в первый блок}
begin
Block[I] := 1;
Forvd[I] := true;
end;
Next[1] := 0;
{Вывод}
Output1;
{ Output2; }
J := N; {J - активный элемент}
while J > 1 do
begin
K := Block[J];
If Forvd[j] then { j движется вперед}
begin
if Next [K] = 0 then {K -последний блок}
begin
Next[K] := J;
Prev[J] := K;
Next[J] := 0;
end;
if Next[K] > J then {J образует новый блок}
begin
Prev[J] := K;
Next[J] := Next[K];
Prev[Next[J]] := J;
Next[K] := J;
end;
Block[J] := Next[K];
end
else {J движется назад}
begin
Block[J] := Prev[K];
if K = J then {J образует одноэлементный блок}
if Next[K] = 0 then
Next[Prev[K]] := 0
else
begin
Next[Prev[K]] := Next [K];
Prev[Next[K]] := Prev[K];
end;
end;
{if ReadKey = char(27) then Exit; }
J := N;
while (J > 1) and
((Forvd[J] and (Block[J] = J)) or (not Forvd[J] and (Block[J] = 1))) do
begin
Forvd[J] := not Forvd[J];
J := J-1;
end;
{Вывод}
Output1;
{ Output2; }
end;
end.
7Обходы бинарных деревьев
До сих пор мы не обращали особого внимания на методы прохождения рассматриваемой структуры данных, т.к. они заведомо диктовалась ее организацией. Например, для списков это было прохождение от первого элемента списка к последнему элементу, либо от последнего элемента списка к первому элементу. Но в случае БД такого жесткого порядка нет, и можно применить несколько методов прохождения. Общий принцип - каждый узел дерева должен быть пройден только один раз.
Наиболее распространены три метода прохождения БД:
в прямом порядке;
в симметричном порядке;
в обратном порядке;
Часто применяется и четвертый метод прохождения БД – в горизонтальном порядке.
В каждом из трех первых методов не требуется никаких действий для прохождения пустого дерева. Методы определяются рекурсивно, так что прохождение БД требует посещения корня и прохождения его левого и правого поддеревьев.
Прохождение БД в прямом порядке
(просмотр дерева в глубину):
Попасть в корень.
Пройти в прямом порядке левое поддерево.
Пройти в прямом порядке правое поддерево.
Применим этот метод к дереву, аналогичному примеру 6.
получим:
A B D H I E L M C F G
Прохождение БД в симметричном порядке:
Пройти в симметричном порядке левое поддерево.
Попасть в корень.
Пройти в симметричном порядке правое поддерево.
Применим этот метод к заданному дереву. Получим:
H D I B L E M A F C G
Прохождение БД в обратном порядке:
Пройти в обратном порядке левое поддерево.
Пройти в обратном порядке правое поддерево.
Попасть в корень.
Применим этот метод к заданному дереву. Получим:
H I D L M E B F G C A
Отдельно следует остановиться на прохождении БД в горизонтальном порядке или прохождении по уровням. Методы прохождения состоит в том, что последовательно выбираются все узлы уровня 0, затем уровня 1 и т. д.
Прохождение БД в горизонтальном порядке:
(просмотр дерева по уровням)
Установить уровень узла К = 0.
Выбрать все узлы уровня К.
Пока не достигнут максимальный уровень К := К + 1. Перейти на пункт 2.
Применим этот метод к заданному дереву. Получим:
A B C D E F G H I L M
В задачах поиска решений, свойственных задачам искусственного интеллекта, применяются разновидности прохождения БД в прямом и горизонтальном порядке. Такое прохождение называют соответственно поиск в глубину и поиск в ширину. Соответствующие процедуры прохождения БД будут рассмотрены ниже после анализа способов представления БД.