- •Содержание
- •Введение.
- •1. Основы анализа алгоритмов
- •1.1. Сравнительные оценки алгоритмов
- •1.2. Элементарные операции в формальной системе
- •1.3. Классы входных данных
- •1.4. Классификация алгоритмов по виду функции трудоемкости
- •1.5. Классификация скоростей роста. Асимптотический анализ функций
- •1. Оценка (тета)
- •2. Оценка о (о большое)
- •3. Оценка (Омега)
- •1.6. Эффективность рекурсивных алгоритмов
- •1.7. Анализ программ
- •1.8. Вопросы для самоконтроля
- •Классификация алгоритмов по виду функции трудоемкости.
- •2. Алгоритмы поиска и выборки
- •2.1. Последовательный поиск
- •2.2. Двоичный поиск
- •2.3. Задача выборки
- •2.4. Вопросы для самоконтроля
- •3.Алгоритмы сортировки
- •3.1. Сортировка трех чисел по месту
- •3.2. Сортировка вставками
- •3.3. Пузырьковая сортировка
- •3.4. Сортировка Шелла.
- •3.5. Корневая сортировка
- •3.6. Сортировка методом индексов
- •3.7. Быстрая сортировка (алгоритм Хоара)
- •3.8. Вопросы для самоконтроля
- •Сортировка Шелла.
- •Сортировка методом индексов.
- •4. Алгоритмы на графах
- •4.1. Основные понятия теории графов
- •4.2. Структуры данных для представления графов
- •4.3. Алгоритмы обхода вершин графа
- •4.3.1. Обход в глубину
- •4.3.2. Обход в ширину
- •4.4. Поиск остовного дерева минимального веса
- •4.4.1. Алгоритм Дейкстры – Прима
- •4.4.2. Алгоритм Крускала
- •4.5. Алгоритм поиска кратчайшего пути
- •4.6. Вопросы для самоконтроля
- •Структуры данных для представления графов.
- •5. Численные методы
- •5.1. Вычисление значений многочленов
- •5.2. Умножение матриц
- •5.2.1 Стандартный алгоритм умножения матриц
- •5.2.2. Умножение матриц по Винограду
- •5.2.3. Умножение матриц по Штрассену
- •5.3. Вопросы для самоконтроля
- •Стандартный алгоритм умножения матриц.
- •6. Алгоритмы сравнения с образцами
- •6.1. Сравнение строк
- •6.2. Алгоритм Кнута – Морриса – Пратта
- •6.3. Алгоритм Бойера - Мура
- •6.4. Вопросы для самоконтроля
- •7. Вычислительная геометрия
- •7.1. Основные понятия
- •7.2. Векторное произведение векторов
- •7.2.1. Ориентированная площадь треугольника
- •7 .3. Задача о выпуклой оболочке
- •7.3.1. Алгоритм Грэхема
- •7.3.2. Алгоритм Джарвиса
- •7.3.3. Рекурсивный алгоритм
- •7.4. Вопросы для самоконтроля
- •8. Задачи класса np
- •8.1. Примеры np-полных задач
- •8.1.1. Задача о коммивояжере
- •8.1.2. Задача о раскраске графа
- •8.1.3. Раскладка по ящикам
- •8.1.4 Упаковка рюкзака
- •8.1.5. Задача о суммах элементов подмножества
- •8.1.6. Задача о планировании работ
- •8.2. Приближенные эвристические решения nр-полных задач.
- •8.2.1. Жадные приближенные алгоритмы
- •8.2.2. Приближения в задаче коммивояжера
- •8.2.3. Приближения в задаче о раскладке по ящикам
- •8.2.4. Приближения в задаче об упаковке рюкзака
- •8.3. Вопросы для самопроверки
- •Приближения в задаче об упаковке рюкзака.
- •9. Динамическое программирование
- •Часть1--------------------
- •10. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
3.6. Сортировка методом индексов
Идея этого метода состоит в том, что каждый элемент массива A, такого, что все его элементы это целые, положительные, несовпадающие числа, записывается в ячейку другого пустого массива. Номер ячейки, в которую помещается элемент, соответствует числовому значению элемента. То есть элемент с числовым значением 3 из первого массива вписывается в третью ячейку второго массива, 11 – в одиннадцатую и т.д.
Схема сортировки следующая:
Дан массив A = {ai | ai≠aj ij, i=1N, j=1N}.
Сначала ищем максимум в массиве А. Такую же размерность будет иметь вспомогательный массив В.
Объявление вспомогательного массива B [1..Max(A)] и обнуление его элементов.
Вписываем элементы массива А в ячейки массива В по вышеприведенному принципу.
Восстановление массива А из массива В путем удаления нулей.
IndexSort (A, N)
Max Maxim (A, N) // поиск максимума
for j=1 to Max
B[j]0
endfor
for i=1 to N do
B[A[i]]A[i]
endfor
k1
For j=1 to Max
if B[j] 0 then
A [k] j
k k+1
endif
endfor
end
Так же, как и в предыдущем случае, функция трудоемкости данного алгоритма линейна, то есть fА(N, Max)=10Max+15N. И так же требуется существенный дополнительный объем памяти для вспомогательного массива В.
Пример 3.5. Сортировка индексами. Исходный список (3,5,1,11,8).
Максимальный элемент списка – 11. Значит, размерность дополнительного массива –11. Заполняем его значениями из списка А:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
индекс В |
1 |
0 |
3 |
0 |
5 |
0 |
0 |
8 |
0 |
0 |
11 |
значение B(j) |
Обратная сборка ненулевых элементов из В в А дает отсортированный список (1,3,5,8,11).
Задание. Как можно модифицировать алгоритм для случая, когда в массиве имеются отрицательные целые элементы? повторяющиеся значения?
3.7. Быстрая сортировка (алгоритм Хоара)
Этот метод был разработан в 1962 г. Чарльзом Ричардом Хоаром.
Быстрая сортировка выбирает элемент списка, называемый осевым, а затем переупорядочивает список таким образом, что все элементы меньшие осевого, оказываются перед ним, а большие – за ним. В каждой из этих частей списка элементы не упорядочиваются.
Если i - окончательное положение осевого элемента, то нам известно лишь, что все значения от 1 до (i – 1) меньше осевого, а значение с номерами (i + 1) до N – больше осевого.
Затем алгоритм QSort вызывается рекурсивно на каждой из двух частей. При вызове процедуры QSort на списке, состоящем из одного элемента, он ничего не делает, поскольку одноэлементный список уже отсортирован.
Анализ наихудшего случая
В наилучшем случае быстрая сортировка при разделении списка дает 2 части одинакового размера. Число шагов (log2N) и на каждом шаге выполняется N сравнений.
Следовательно, в наихудшем случае размеры частей должны быть максимально неравны. Это достигается, когда значение осевого элемента либо больше, либо меньше всех остальных в списке.
В этом случае в одном из списков нет ни одного элемента, а в другом - (N – 1). Если такая ситуация возникает при всяком рекуррентном вызове, то всякий раз будет происходить удаление одного элемента, следовательно число сравнений
Такой порядок бывает в уже отсортированных списках. Наихудший случай бывает для уже упорядоченного списка.
Таким образом, в лучшем случае трудоемкость такой сортировки fА (N)= O(N log2N), в наихудшем случае ее эффективность такая же, как у сортировки вставками и пузырьковой fА (N)=О(N2).
Qsort (A, first, last)
// A - сортируемый список
// first - номер 1 –го элемента в сортируемой части
// last - номер последнего элемента в сортируемой части
if first < last then
// Функция OS определяет положение осевого элемента в списке
// и переупорядочивает список по указанному принципу.
i OS (A, first, last)
Qsort (A, first, i – 1)
Qsort (A, i + 1, last)
endif
end
Детальный анализ [1] показывает, что в среднем случае асимптотическая оценка O(N log2N) остается в силе, однако коэффициент у главного порядка функции трудоемкости будет больше, чем в лучшем случае.