
- •Содержание
- •Введение.
- •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. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
4.6. Вопросы для самоконтроля
Структуры данных для представления графов.
Алгоритмы обхода графа в глубину; в ширину.
Поиск минимального остовного дерева методом Дейкстры-Прима.
Поиск минимального остовного дерева методом Крускала.
Поиск кратчайшего пути.
5. Численные методы
Математические вычисления лежат в основе большого числа разнообразных программ. Компьютерная графика требует большого объема вычислений с многочленами и матрицами. Эти вычисления обычно выполняют для каждой точки экрана, поэтому даже незначительные улучшения алгоритма могут привести к заметному ускорению. (Например, при размере экрана в 1024х768 точек – даже выигрыш на одно умножение на каждой из позиций приводит к значительной экономии!).
Умножение матриц встречается в многочисленных приложениях. Модели физических объектов в компьютерной графике, а также компьютерном проектировании, часто представляют собой матрицы.
Общее свойство всех этих применений состоит в том, что матричные операции выполняются часто, поэтому чем быстрее они осуществляются, тем быстрее работают использующие их программы.
Пример: изображение 512х512 точек. При применении шаблона 5х5 точек при свертке – шаблон умножается на блоки картинки для всех возможных положений блока (512 – 5 + 1) = 508 положений по вертикали и столько же по горизонтали. Следовательно, матрица (5х5) должна быть умножена на 258 064 блоков.
При использовании стандартного алгоритма умножения матриц потребуется 32 258 000 умножений. Более эффективный алгоритм позволяет сэкономить значительное время.
В этом разделе нас будет интересовать число сделанных арифметических операций, поэтому будем подсчитывать число сложений (умножений).
При анализе численных алгоритмов в качестве параметра будет выбираться либо наивысшая степень многочлена, либо размер перемножаемых матриц.
5.1. Вычисление значений многочленов
Для полного многочлена n-ой степени вида:
P(x) = anxn + an –1 xn-1 + an-2 xn-2 + … + a1 x + a0 ,
будем предполагать, что коэффициенты (an … a0) известны и записаны в массив. Единственным входным данным служит х, а результат программы – значение многочлена в точке х.
Стандартный алгоритм вычисления
Evaluate (x, A)
// A – массив коэффициентов многочлена
result a[0] + a [1] * x
x_Pow x
for i = 2 to n do
x_Pow x_Pow * x
result result + a [i] * x_Pow
endfor
return (result)
end
В цикле for содержатся 2 умножения, которые выполняются (n – 1) раз. Кроме того, одно умножение выполняется до цикла, поэтому общее число умножений 2( n – 1) + 1 = 2n – 1.
В цикле выполняется также одно сложение и еще одно до входа в цикл, следовательно, сложений n – 1 +1 = n.
Общее число операций – (2n – 1) умножений и n сложений.
Схема Горнера
Эта схема основывается на следующем представлении многочлена:
p(x) = (((… ((an x1 + an-1)x + an-2) x + an – 3 + … + a1) x + a0
Соответствующий алгоритм имеет вид:
Horner (x, A)
result a [n]
for i = n – 1 down 0 do
result result * x + a [i]
end for
return (result)
end
Цикл выполняется n раз, внутри одно умножение и одно сложение.
Общее число операций: n умножений и n сложений – двукратное уменьшение числа умножений по сравнению со стандартным алгоритмом.