Изменения

Перейти к: навигация, поиск

Задача о порядке перемножения матриц

154 байта добавлено, 07:42, 10 декабря 2011
Нет описания правки
//Не окончательный вариант --[[Участник:GosuGDR|GosuGDR]] 07:02, 10 декабря 2011 (MSK)
'''Задача о порядке перемножения матриц''' — классическая задача, которая может быть решена с помощью динамического программирования. В этой задаче нам дана Нам дается последовательность матриц, в которой мы хотим найти самый эффективный способ их перемножения. На самом деле задача заключается не в нахождении результата перемножения, а просто в нахождении нужного порядока, в котором мы будем перемножатьпорядка этого перемножения.
  == Решение динамическим программированием == === Постановка задачи ===У нас есть много множество способовперемножить, потому что операция перемножения ассоциативна. Другими словами, нет разницы как в каком порядке мы расставим скобки между множителями, результат будет один и тот же. Например, если у нас есть четыре матрицы ''A'', ''B'', ''C'' и ''D'', то у нас есть существуют следующие варианты:
:(''ABC'')''D'' = (''AB'')(''CD'') = ''A''(''BCD'') = ''A''(''BC'')''D'' = ....
Однако, порядок в котором мы расставим скобки в нашем выражении между матрицами повлияет на количество простых арифметических операций, которые мы потратим потребуются на вычисление ответа, или, другими словами, на ''эффективность''.
Например, предположим, что А = (10 × 30), B = (30 × 5), C = (5 × 60). Тогда:
:''A''(''BC'') = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 операций.
ОчевидноКак мы видим, что первый способ гораздо эффективней. Теперь мы понялистало понятно, что нам надо найти оптимальную расстановку скобок в нашем выражении из ''n'' матриц. Как бы это сделать? Мы можем перебрать все расстановки скобок (brute force), но время выполнение выполнения этого алгоритма будет эксапаненциально рости расти экспоненциально от ''n'' количества матриц. Решение данной проблемызадачи, как мы увидим — это разбить нашу задачу на подзадачи. Так же мы увидим, что с помощю решения однократного решения подзадачи и повторного использования ответа, мы сможем заметно сократить асимптотику.
== Решение динамическим программированием = Перебор всех вариантов ===
Сначала, давайте считать то, что мы хотим знать минимальное количесвто операций (или минимальную стоимость), необходимых для перемножения матриц. Если мы перемножаем только две матрицы, то мы можем осуществить это только едиственным способом, следовательно минимальная стоимость — это стоимость этого перемножения. В общем, мы можем найти минимальную стоимость используя следующий рекурсивный алгоритм:
Внезапно, если мы применим этот алгоритм, то мы обнаружим, что это так же медленно, как и наивный способ перебирания всех скобочных последовательностей! Что пошло не так? Ответом на этот вопрос является то факт, что мы делаем много ненужной работы. Например, в выше описанном алгоритме, мы сделали рекурсивный вызов, чтобы найти наилучшую стоимость для подсчета ''ABC'' и ''AB''. Но нахождение наилучшей стоимости для подсчета ''ABC'' так же требует нахождения лучшей стоимости для ''AB''. Так как рекурсия растет вглбь все больше и больше, то и число ненужных повторений увеличивается.
 
=== Динамическое программирование ===
Одно из простых решений: ''меморизация''. Каждый раз, когда мы считаем минимальную стоимость на отрезке, мы сохраняем ответ. Когда у нас просят посчитать это ещё раз, то мы сразу же выдадим ответ и не будем пересчитывать. Хоть у нас <math> n^2/2 </math>
90
правок

Навигация