
- •Введение
- •1. Булевы функции
- •1.1. Определение булевых функций
- •Контрольные задания
- •1.2. Построение сндф, снкф и снпф. Минимизация
- •1.3. Реализация метода Квайна – Мак-Класки
- •Контрольное задание
- •Варианты задания
- •1.4. Замкнутые классы. Полнота. Теорема Поста
- •Контрольное задание
- •1.5. Моделирование релейно-контактных схем
- •Котрольное задание
- •1.6. Моделирование сумматоров
- •Контрольное задание
- •2. Основные положения математической логики
- •2.1. Формальные теории
- •2.2. Исчисление высказываний
- •2.3. Исчисление предикатов
- •2.4. Приложение исчисления предикатов к аналитической геометрии
- •Контрольное задание
- •3. Вычислимость
- •3.1. Неформальное определение алгоритма. Примеры
- •Контрольное задание
- •3.3. Рекурсия
- •3.4. Вычислимость по Тьюрингу
- •4. Конечные автоматы
- •4.1. Основные определения и способы задания
- •Контрольное задание
- •4.2. Эквивалентность автоматов. Минимизация
- •Контрольное задание
- •4.3. Автоматы Мили и Мура. Размеченные графы
- •4.4. Автоматные языки
- •4.5. Возможности автоматов
- •5. Некоторые классические алгоритмы
- •5.1. Алгоритмы сортировки и их классификация
- •5.2. Поиск
- •Библиографический список
- •Оглавление
5. Некоторые классические алгоритмы
5.1. Алгоритмы сортировки и их классификация
Сортировка – это фактически неотъемлемая часть решения всех математических задач, заключающаяся в установлении линейного порядка на множестве.
Примеры: составление списка студентов в журнале; список выигрышных билетов в лотерее.
Постановка задачи. Имеется перетасованная колода карт, с каждой из которых сопоставлен ее порядковый номер. Требуется восстановить порядок.
Алгоритм 1. Рассмотрим массив длиной 36. Берем карту из стопки и помещаем ее номер в первую позицию.
Берем вторую карту. Если ее номер превышает номер помещенной позиции, то записываем во вторую позицию. В противном случае сдвигаем содержимое первой позиции во вторую, в первую позицию записываем номер взятой карты. Процесс повторяется, пока в колоде есть карты.
Данный алгоритм называется «алгоритм вставок».
Алгоритм 2. Рассмотрим алгоритм, эквивалентный приведенному, который заключается в следующем.
Берем первую карту. Помещаем эту карту в позицию, номер которой совпадает с номером карты. Далее берем вторую карту и повторяем предыдущее действие.
В этих двух алгоритмах результаты одинаковы.
Рассмотрим в качестве критериальной функции количество перемещений содержимого ячеек в первом и во втором алгоритмах.
Рассмотрим наилучший и наихудший случаи.
Наилучший вариант: пусть исходная колода уже упорядочена, тогда количество перемещений содержимого равно нулю.
Наихудший вариант: в колоде расположение обратное.
По
выбранному критерию первый алгоритм
имеет эффективность
,
второй – 1.
Для реализации первого алгоритма можно построить вариант, при котором не нужна организация нового массива.
Применение второго алгоритма связано с необходимостью выделения внешней памяти. Если ее нет или она очень дорого стоит, то второй алгоритм оказывается неприемлемым.
Помимо алгоритма вставок, имеется большое количество алгоритмов внутренней сортировки, эквивалентных ему по значению критериальной функции.
Пример:
for i:=1 to n do
for j:=1 to n do
if a[i]>a[j] then begin
c:=a[i]; a[i]=a[j]; a[j]=c;
end;
Алгоритм класса для больших массивов применять запрещено.
Пусть имеется два упорядоченных по возрастанию массива. Нужно получить массив из двух данных (упорядочить так же). Пусть имеется внешняя память. Основная идея: на каждом шаге перемещения осуществляются по тому из массивов, на вершине которого находится наименьший элемент. Перемещения сопровождаются записью этого элемента в новый массив и удалением его из того массива, в котором он располагался.
Замечание. Необходимо предусмотреть дописывание «хвоста» – остатков того множества, которое было не пустым.
Предложенный
Дж. фон Нейманом алгоритм сортировки
массива основывается на идее слияния.
Количество операций при использовании
этого алгоритма имеет порядок
.
Рассмотрим первых два элемента массива, упорядочим их по возрастанию и заново запишем первые две позиции. Рассмотрим элементы, находящиеся на 3-й и 4-й позициях, упорядочим их по возрастанию и т.д. Если число элементов нечетное, то при окончании прохода по массиву нечетный элемент (последний) не изменяется.
Шаги таковы:
1. Рассмотрим два массива (каждый длиной 2), которые расположены в 1-й и 2-й (первый массив) и 3-й и 4-й (второй массив) позициях. Оба массива упорядочены.
Образуем массив длиной 4, он также упорядочен. Расположим его элементы в позициях 1, 2, 3, 4. Рассмотрим второй массив, элементы которого находятся в позициях 5, 6, 7, 8. Применим метод слияния и получим упорядоченный массив длиной 4.
2. Рассмотрим два массива (каждый длиной 4), расположенных в позициях 1, 2, 3, 4 и 5, 6, 7, 8. Образуем из них массив длиной 8. Записываем его элементы в позициях 1 – 8.
3. Рассмотрим первые две восьмерки, каждая из которых упорядочена. С помощью слияния образуем массив длиной 16 и т.д.
Алгоритм остановится естественным путем.
Замечание.
Имеются и другие алгоритмы, применение
которых требует примерно такого же
количества операций сравнения. Это
пирамидальная
сортировка,
двоичная
сортировка.
Их можно объединить в класс
-эквивалентных
алгоритмов.
Другой класс образуют алгоритмы линейной сортировки. Примером является алгоритм ковшовой сортировки.
Описание алгоритма ковшовой сортировки.
Дан массив длиной . Требуется упорядочить его по возрастанию.
1. За один проход вычисляем наибольшее и наименьшее значения элементов массива.
2. Образуем внешний массив с той же длиной. Каждый элемент этого массива имеет тип – указатель.
3. Последовательно просматриваем исходный массив.
Пусть появилось некоторое значение . Вычисляем номер ковша
.
Во внешнем массиве рассматривается элемент с номером (т.е. ковш с номером ). В него заносится адрес рассматриваемого элемента . Процесс продолжается до исчерпания всего исходного массива.
4. В каждом ковше образуется список номеров элементов, попавших в данный ковш. Упорядочиваем элементы внутри каждого из ковшей любым из простейших способов.
5. Читаем внешний массив последовательно.
Пример:
12 |
17 |
2 |
5 |
8 |
19 |
22 |
15 |
11 |
10 |
4 |
7 |
16 |
28 |
3 |
9 |
13 |
6 |
20 |
;
;
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
5 |
|
|
8 |
|
|
12 |
13 |
15 |
17,16 |
|
|
|
|
|
|
|
|
Некоторые из черпаков (ковшей) оказываются пустыми. Для оценивания количества операций отметим, что в каждом из черпаков окажется в среднем по одному элементу.
Упорядочение внутри одного черпака потребует в среднем одно действие. Поэтому общее количество операций будет иметь порядок .