
- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Динамическое программирование
Динамическое программирование решает задачу, разбивая её на подзадачи и объединяя их решения.. Динамическое программирование применимо тогда, когда подзадачи не являются независимыми, иными словами, когда у подзадач есть общие «подподзадачи»
Алгоритм, основанный на динамическом программировании, решает каждую из подзадач единожды и запоминает ответы в специальной таблице. Это позволяет не вычислять заново ответ к уже встречавшейся подзадаче.
В типичном случае динамическое программирование применяется к задачам оптимизации
У такой задачи может быть много возможных решений; их «качество» определяется значением какого-то параметра, и требуется выбрать оптимальное решение, при котором значение параметра будет минимальным или максимальным (в зависимости от постановки задачи). В общем случае, оптимум может достигаться для нескольких разных решений.
Построение алгоритма, основанного на динамическом программировании.
Надо:
1) описать строение оптимальных решений,
2) выписать рекуррентное соотношение, связывающее оптимальные значения параметра для подзадач,
3) двигаясь снизу вверх, вычислить оптимальное значение параметра для подзадач,
4) пользуясь полученной информацией, построить оптимальное решение.
Перемножение нескольких матриц
Мы хотим найти произведение
A1A2…An (1)
последовательности п матриц (A1, A2, ….., An). Мы будем пользоваться стандартным алгоритмом перемножения двух матриц в качестве подпрограммы. Но прежде надо расставить скобки в (1), чтобы указать порядок умножений.
Будем говорить, что в произведении матриц полностью расставлены, если это произведение либо состоит из одной-единственной матрицы, либо является заключенным в скобки произведением двух произведений с полностью расставленными скобками.
Поскольку умножение матриц ассоциативно, конечный результат вычислений не зависит от расстановки скобок.
В произведении A1A2A3A4 можно полностью расставить скобки пятью разными способами:
(A1(A2(A3A4)))
(A1((A2A3)A4))
((A1A2)(A3A4))
((A1(A2A3))A4)
(((A1A2)A3)A4)
Способ расстановки скобок может сильно повлиять на стоимость перемножения матриц.
Стандартный алгоритм перемножения матриц.
rows и columns - количество строк и столбцов матрицы
MATRIX-MULTIPLY (A, B)
1 if columns [A] rows [B]
2 then error “умножить нельзя”
3 else for i 1 to rows [A]
4 do for j 1 to columns [B]
5 do C[i,j] 0
6 for k 1 to columns [A]
7 do C[i,j] C[i,j]+A[i,k]B[k,j]
8 return C
Если А – это ( p х q ) матрица, а В – это (q х r) матрица, то их произведение С является (p х r) матрицей.
Задача об умножении последовательности матриц
Дана последовательность из n матриц A1, A2, ….., An заданных размеров (матрица Ai имеет размер pi-1 х pi); требуется найти такую (полную) расстановку скобок в произведении A1A2 … An , чтобы вычисление произведения требовало наименьшего числа умножений.
Количество расстановок скобок
Простой перебор всех возможных расстановок скобок не даст эффективного алгоритма.
Разобъем матрицы на группы по три: произведение для каждой группы можно вычислить двумя способами, так что для 3 n матриц есть не менее 2n вариантов.
Шаг 1: строение оптимальной расстановки скобок
Мы должны описать строение оптимальных решений. Для задачи об умножении последовательности матриц это выглядит следующим образом. Обозначим через Ai..j матрицу, являющуюся произведением AiAi+1 … Aj . Оптимальная расстановка скобок в произведении A1A2…An разрывает последовательность между Ak и Ak+1 для некоторого k, удовлетворяющего неравенству 1k<п. При вычислении произведения, диктуемом этой расстановкой скобок, мы сначала вычисляем произведения A1..k и Ak+1..n ) а затем перемножаем их и получаем окончательный ответ A1+n
Стоимость этой оптимальной расстановки равна стоимости вычисления матрицы A1..k плюс стоимость вычисления матрицы Ak+1..n плюс стоимость перемножения этих двух матриц.
Чем меньше умножений нам потребуется для вычисления A1..k и Ak+1..n , тем меньше будет общее число умножений.
Стало быть, оптимальное решение задачи о перемножении последовательности матриц содержит оптимальные решения задач о перемножении её частей. Это позволяет применить динамическое программирование.
Шаг 2: рекуррентное соотношение
Надо выразить стоимость оптимального решения задачи через стоимости оптимальных решений её подзадач. Такими подзадачами будут задачи об оптимальной расстановке скобок в произведениях Ai..j = AiAi+1 … Aj для 1 i j п. Обозначим через т[i,j] минимальное количество умножений, необходимое для вычисления матрицы Ai..j
т[i,j] = 0, при i = j
Шаг
3: вычисление оптимальной стоимости
Вычисление «снизу вверх»
Предполагается
матрица Ai имеет размер pi-1 × pi при i = 1,2,2,…,n
на входе последовательность
length[p] = n+1
Используются вспомогательные таблицы
m[1..n,1..n]
s[1..n,1..n]
Matrix-Chain-Order (p)
1 n length[p] - 1
2 for i 1 to n
3 do m[i,i] 0
4 for l 2 to n
5 do for i 1 to n – l +1
6 do j i + l - 1
7 m[i, j] ∞
8 for k i to j –1
9 do q m[i,k]+m[k + 1,j] + pi-1 pk pj
10 if q < m[i,j]
11 then m[i,j] q
12 s[i,j] k
13 return m, s
Шаг 4: построение оптимального решения
Matrix-Chain-Multiply (A,s,i,j)
1 if j > i
2 then X Matrix-Chain-Multiply (A,s,i, s[i,j])
3 Y Matrix-Chain-Multiply (A,s, s[i,j]+1 ,j)
4 return Matrix-Multiply (X, Y)
5 else return A