
- •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Процедуры поиска на бинарных деревьях
- •Рекомендованная литература
2.10Сравнение сортировок
Ранее были приведены точные аналитические формулы для определения числа сравнений и перестановок в случае простых алгоритмов сортировок. Для усовершенствованных сортировок такие формулы отсутствуют. Известны приблизительные верхние оценки затрат на сортировку такими методами.
Таблица 1.2
-
Тип сортировки
Количество действий
ShellSort
C*n1.2
HeapSort
C*n*log2 n
QuickSort
C*n*log2 n
где С – некоторые коэффициенты, в общем случае, превышающие 1.
Для более наглядного сравнения сортировок ниже приводятся относительные затраты времени, полученные на некотором компьютере, для разных методов сортировки, которые обрабатывают одни и те же массивы:
упорядоченный по возрастанию;
заполненный произвольным методом;
упорядоченный по убыванию.
Поля таблицы можно рассматривать как значения, взятые в некоторых условных единицах (на самом деле в миллисекундах для конкретного компьютера), которые отражают скорость работы разных методов сортировки.
Таблица 1.3
|
М А С С И В |
||
Наименование |
упорядоченный по возрастанию |
случайный порядок |
упорядоченный по убыванию |
|
при n=256 |
||
StraightInsertion |
0.02 |
0.82 |
1.64 |
ShellSort |
0.10 |
0.24 |
0.28 |
StraightSelection |
0.94 |
0.96 |
1.18 |
HeapSort |
0.20 |
0.20 |
0.20 |
BubbleSort |
1.26 |
2.04 |
2.80 |
QuickSort |
0.08 |
0.12 |
0.08 |
|
при n=2048 |
||
StraightInsertion |
0.22 |
50.74 |
103.80 |
ShellSort |
0.80 |
7.08 |
12.34 |
StraightSelection |
58.18 |
58.34 |
73.46 |
HeapSort |
2.32 |
2.22 |
2.12 |
BubbleSort |
80.18 |
128.84 |
178.66 |
QuickSort |
0.72 |
1.22 |
0.76 |
Можно сделать несколько выводов. Но остановимся на двух самых выразительных.
Пузырьковая сортировка - худшая из всех.
Быстрая сортировка в 2-3 раза лучше, чем пирамидальная.
3Поиск подстроки в строке
Задача поиска подстроки в строке характерна для всех текстовых процессоров и состоит в нахождении первого по порядку вхождения некоторой подстроки в обрабатываемый текст. Затем возможен поиск следующего вхождения и т.д.
Задача поиска подстроки в строке крайне распространена в современных средствах информатики и, поэтому, важно найти эффективные алгоритмы ее решения.
Постановка задачи имеет следующий вид. Пусть задана строка S из n элементов и подстрока P из m элементов, причем
0 <= m <= (n-1)
Необходимо найти позицию i в строке S, начиная с которой выполняется посимвольное совпадение элементов строки S и элементов образа P.
Описание соответствующих строк (массивов типа char) и переменных имеет вид:
var S: string;
P: string;
N: integer; {размер исходной строки}
M: integer; {размер искомой подстроки}
begin
N := Length (S);
M := Length (P);
end;
Тогда строку S можно рассматривать как некоторый текст, а строку P - как некоторое слово или подстроку этого текста. В этом случае задача поиска, обозначим ее Find, сводится к поиску первого вхождения заданного слова (подстроки) в заданный текст.