- •Содержание
- •Введение.
- •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. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
5.2. Умножение матриц
Матрица - математический объект, эквивалентный двумерному массиву. Числа располагаются в матрице по строкам и столбцам. Две матрицы одинакового размера можно поэлементно сложить или вычесть друг из друга.
Если число столбцов в первой матрице совпадает с числом строк во второй матрице, то эти две матрицы можно перемножить. У произведения будет столько же строк, сколько в первой матрице и столько же столбцов, сколько во второй.
При умножении матриц размером 3х4 на матрицу размером 4х7 мы получаем матрицу размером 3х7.
Умножение матриц некоммутативно: оба произведения АВ и ВА двух квадратных матриц одинакового размера можно вычислить, однако результаты, вообще говоря, будут отличаться друг от друга.
Для вычисления произведения двух матриц каждая строка первой матрицы умножается почленно на каждый столбец второй. Затем подсчитывается сумма таких произведений и записывается в соответствующую клетку результата:
a |
b |
c |
|
A |
B |
|
aA+bC+cE |
aB+bD+cF |
|
|
|
|
C |
D |
= |
|
|
d |
e |
f |
|
E |
F |
|
dA+eC+fE |
dB+eD+fF |
Умножение вышеприведенных матриц требует 12 умножений и 8 сложений.
5.2.1 Стандартный алгоритм умножения матриц
Стандартный алгоритм умножения матрицы размером ab на матрицу размером bc выполняет abc умножений и a(b - 1)c сложений.
MultMatrix(G,H,R)
// R = G H
// размеры матриц R(ac), G(ab), H(bc)
for i=1 to a do
for j=1 to c do
R [i,j] 0
for k = 1 to b do
R[i, j] R[i, j] +G[i, k] * H[k, j]
end for // (k)
end for // (j)
end for // (i)
end
На первый взгляд это минимальный объем работы, необходимый для перемножения 2-х матриц. Однако исследователям не удалось доказать его минимальность, и в результате они обнаружили другие алгоритмы, умножающие более эффективно.
5.2.2. Умножение матриц по Винограду
Если посмотреть на результат умножения 2-х матриц, то видно, что каждый элемент в нем представляет собой скалярное произведение соответствующих строки и столбца исходных матриц
Рассмотрим два вектора V = (v1, v2, v3, v1) и W =(w1, w2, w3, w4 )
Их скалярное произведение V *W = v1w1 + v2w2 + v3w3 + v4w4
Это равенство можно переписать в виде
V*W = (v1 + w2) (v2 + w1) + (v3 + w4 ) (v4 + w3 ) - v1v2 - v3v4 - w1w2 - w3w4
Кажется, что второе выражение задает больше работы, чем первое: вместо четырех умножений их шесть, а вместо трех сложений – десять. Менее очевидно, что выражение в правой части допускает предварительную обработку: его части (v1v2 , v3v4 , w1w2 , w3w4) можно вычислить заранее и запомнить для каждой строки первой матрицы и для каждого столбца второй.
То есть над предварительно обработанными элементами нам придется выполнять лишь первые два умножения и последующие 5 сложений, а также – дополнительно 2 сложения.
MultMatrixVinograd( G, H, R)
d b/2
// вычислить построчные произведения rowF для G
for i=1 to a do
rowf[i] G [i, 1] * G [i, 2]
for j = 2 to d do
rowf [i] rowf[i] + G [i, 2j – 1] * G [i, 2j]
endfor j
endfor i
// вычислить произведения для столбцов colF матрицы H
for i = 1 to c do
colf [i] H [1, i] * H [2, i]
for j = 2 to d do
colf [i] colf [i] + H [2j - 1, i ] * H [2j, i ]
endfor j
endfor i
// вычисление R
for i=1 to a do
for j = 1 to c do
R [i, j] - rowf [i] - colf [j]
for k = 1 to d do
R [i, j] R[i, j] + ( G[i,2k-1] + H[2k, j]) * (G[i, 2k] + H[2k-1,j)
endfor k
endfor j
endfor i
// прибавление членов в случае нечетной общей размерности
if (2 * (b/2)) <> b then
for i = 1 to a do
for j =1 to c do
R[i, j] R [i, j] + G [ i, b] * H [b, j]
endfor j
endfor i
endif
end
В случае четной общей размерности b общее число умножений (abc+ab+bc)/2 и сложений (a(b-2)+c(b-2)+ac(3b+2))/2.