Черновик:Перемножение матриц — различия между версиями
GosuGDR (обсуждение | вклад) |
GosuGDR (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | '''Задача о порядке перемножения матриц''' — классическая задача, которая может быть решена с помощью динамического программирования. | + | '''Задача о порядке перемножения матриц''' — классическая задача, которая может быть решена с помощью динамического программирования. В этой задаче нам последовательность матриц, в которой мы хотим найти самый эффективный способ перемножения их. На самом деле задача заключается не в нахождении результата перемножения, а просто нужно найти порядок, в котором нам надо их перемножить. |
+ | У нас есть много способов, потому что перемножение ассоциативно. Другими словами, нет разницы как мы расставим скобки между множителями, результат будет один и тот же. Например, если у нас есть четыре матрицы ''A'', ''B'', ''C'' и ''D'', то у нас есть следующие варианты: | ||
+ | :(''ABC'')''D'' = (''AB'')(''CD'') = ''A''(''BCD'') = ''A''(''BC'')''D'' = .... | ||
+ | |||
+ | Однако, порядок в котором мы расставим скобки в нашем выражении повлияет на количество арифметических операций, которые мы потратим на вычисление ответа, или, другими словами, на ''эффективность''. | ||
+ | |||
+ | Например, предположим, что А = (10 × 30), B = (30 × 5), C = (5 × 60). Тогда: | ||
+ | |||
+ | :(''AB'')''C'' = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 операций | ||
+ | :''A''(''BC'') = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 операций. | ||
+ | |||
+ | Очевидно, что первый способ гораздо эффективней. Теперь мы поняли, что нам надо найти оптимальную расстановку скобок в нашем выражении из ''n'' матриц. | ||
+ | Как это сделать? Мы можем перебрать все расстановки скобок (brute force), но время выполнение этого алгоритма будет эксапаненциально рости от ''n'' количества матриц. Решение данной проблемы, как мы увидим — это разбить нашу задачу на подзадачи. С помощю решения подзадач по одному разу и повторного использования решения, мы сможем заметно сократить асимптотику. Эта задача входит в классические задачи | ||
− | |||
− | |||
− | |||
==Динамическое решение== | ==Динамическое решение== | ||
===Сведение задачи к подзадачам === | ===Сведение задачи к подзадачам === | ||
Строка 29: | Строка 38: | ||
* Томас Х. Кормен и др. Алгоритмы: построение и анализ | * Томас Х. Кормен и др. Алгоритмы: построение и анализ | ||
* Sanjoy Dasgupta , Christos H. Papadimitriou, Umesh Vazirani Algorithms | * Sanjoy Dasgupta , Christos H. Papadimitriou, Umesh Vazirani Algorithms | ||
+ | |||
+ | [[Категория: Дискретная математика и алгоритмы]] | ||
+ | [[Категория:Динамическое_программирование]] |
Версия 03:13, 9 ноября 2011
Задача о порядке перемножения матриц — классическая задача, которая может быть решена с помощью динамического программирования. В этой задаче нам последовательность матриц, в которой мы хотим найти самый эффективный способ перемножения их. На самом деле задача заключается не в нахождении результата перемножения, а просто нужно найти порядок, в котором нам надо их перемножить.
У нас есть много способов, потому что перемножение ассоциативно. Другими словами, нет разницы как мы расставим скобки между множителями, результат будет один и тот же. Например, если у нас есть четыре матрицы A, B, C и D, то у нас есть следующие варианты:
- (ABC)D = (AB)(CD) = A(BCD) = A(BC)D = ....
Однако, порядок в котором мы расставим скобки в нашем выражении повлияет на количество арифметических операций, которые мы потратим на вычисление ответа, или, другими словами, на эффективность.
Например, предположим, что А = (10 × 30), B = (30 × 5), C = (5 × 60). Тогда:
- (AB)C = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 операций
- A(BC) = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 операций.
Очевидно, что первый способ гораздо эффективней. Теперь мы поняли, что нам надо найти оптимальную расстановку скобок в нашем выражении из n матриц. Как это сделать? Мы можем перебрать все расстановки скобок (brute force), но время выполнение этого алгоритма будет эксапаненциально рости от n количества матриц. Решение данной проблемы, как мы увидим — это разбить нашу задачу на подзадачи. С помощю решения подзадач по одному разу и повторного использования решения, мы сможем заметно сократить асимптотику. Эта задача входит в классические задачи
Содержание
Динамическое решение
Сведение задачи к подзадачам
Обозначим результат перемножения матриц
через , где . Если , то при любом способе расстановки скобок, последнее выполненное умножение для вычисления между матрицами и , то есть чтобы вычислить надо сначала вычислить , потом и затем их перемножить. Заметим, что если способ расстановки скобок оптимален, то расстановка скобок в этих матрицах должна быть оптимальной, иначе если бы существовал более эффективный способ расстановки скобок в матрицах и , то мы могли бы получить за меньшее число умножений, получаем противоречие, что расстановка скобок в оптимальна. Таким образом мы свели задачу к подзадачам. Это означает, что возможно решить задачу, используя динамическое программирование на подотрезке.Рекурсивное решение
Обозначим через
минимальное количество скалярных умножений для вычисления матрицы . Получаем следующее рекуррентное соотношение:Объясняется оно просто: для того, чтобы найти произведение матриц
при i=j не нужно ничего делать — это и есть сама матрица . При нетривиальном случае мы перебираем все точки разбиения матрицы на матрицы и , ищем кол-во операций, необходимое чтобы их получить и затем перемножаем для получения матрицы .(Оно будет равно кол-ву операций, потраченное на решение подзадач + стоимость умножения матриц ). Считаем, что размеры матриц заданы в массиве и размер матрицы равен . В данном случае рекурсивный метод нельзя использовать напрямую — он будет экспоненциальным из-за большого кол-ва перекрывающихся подзадач.Динамическое программирование
Будем запоминать в двумерном массиве
результаты вычислений для подзадач, чтобы избежать пересчета для уже вычислявшихся подзадач. После вычислений ответ будет в (Сколько перемножений требуется для последовательности матриц от до — то есть ответ на поставленную задачу).Сложность алгоритма будет , так как у нас вариантов выбора и точек разделения для каждого варианта.Ссылки
использованы материалы ru.wikipedia.org [1]
Литература
- Томас Х. Кормен и др. Алгоритмы: построение и анализ
- Sanjoy Dasgupta , Christos H. Papadimitriou, Umesh Vazirani Algorithms