Изменения

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

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

1640 байт добавлено, 10:26, 16 января 2012
Нет описания правки
* Сделать это для каждой возможной позиции в последовательности, в которой она может быть разделена и взять минимум среди всех результатов.
НапримерИли другими словами, если у нас есть четыре давайте обозначим через <tex>f(i, j)</tex> минимальное количество скалярных умножений для вычисления матрицы ''ABCD''<tex>M_{i..j}</tex>, то мы посчитаем для получаем следующее рекуррентное соотношение:<tex> f(''A''i,j)= \left \{ \begin{array}{ll} 0, & i=j \\ min(f(''BCD'')i, (''AB''k)+ f(''CD'')k+1, и (''ABC''j)(''D''+ p_{i-1}p_kp_j | i \le k < j), делая рекурсивные вызовы на отрезках ''ABC'', ''AB'', ''CD'', и ''BCD'', чтобы найти минимальную стоимость. Потом среди них мы выбираем лучший вариант. Так же, этот алгоритм дает не только минимальную стоимость, но и показывает наилучший способ перемножения матриц: нужно только сгрупировать тем же образом матрицы, каким дается нам минимальная стоимость& i < j \end{array} \right.</tex>
Объясняется оно просто: для того, чтобы найти произведение матриц <tex>M_{i..j}</tex> при i=j не нужно ничего делать — это и есть сама матрица <tex>M_i</tex>. При нетривиальном случае мы перебираем все точки разбиения матрицы <tex>M_{i..j}</tex> на матрицы <tex>M_{i..k}</tex> и <tex>M_{k+1..j}</tex>, ищем кол-во операций, необходимое чтобы их получить и затем перемножаем для получения матрицы <tex>M_{i..j}</tex>.(Оно будет равно кол-ву операций, потраченное на решение подзадач + стоимость умножения матриц <tex>M_{i..k}M_{k+1..j}</tex>). Считаем, что размеры матриц заданы в массиве <tex>p</tex> и размер матрицы <tex>M_i</tex> равен <tex>p_{i-1} \times p_i</tex>.  Чтобы привести пример, давайте вернемся к нашим матрицам. Если у нас есть четыре матрицы ''ABCD'', то мы посчитаем для (''A'')(''BCD''), (''AB'')(''CD''), и (''ABC'')(''D''), делая рекурсивные вызовы на отрезках ''ABC'', ''AB'', ''CD'', и ''BCD'', чтобы найти минимальную стоимость. Потом среди них мы выбираем лучший вариант. Так же, этот алгоритм дает не только минимальную стоимость, но и показывает наилучший способ перемножения матриц: нужно только сгрупировать тем же образом матрицы, каким дается нам минимальная стоимость. Однако, если мы применим этот алгоритм, то мы обнаружим, что он работает также медленно, как и наивный способ перебирания всех скобочных последовательностей! Что пошло не так? Ответом на этот вопрос является то факт, что мы делаем значительное количество ненужной работы. Например, в выше описанном алгоритме, мы делали рекурсивный вызов, чтобы найти наилучшую стоимость для подсчета ''ABC'' и ''AB''. Но нахождение наилучшей стоимости для подсчета ''ABC'' так же требует нахождения лучшей стоимости для ''AB''. Так как рекурсия растет вглубь все больше и больше, то и число ненужных повторений увеличивается. Итоговая асимптотика, как было сказано выше, равняется ''n''–ому [http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%9A%D0%B0%D1%82%D0%B0%D0%BB%D0%B0%D0%BD%D0%B0 числу Каталана], да плюс вычисление для каждой правильной скобочной последовательности ''затрат'' на перемножение (то есть <tex>O(n \cdot C_n)</tex>). <!--<tex>N</tex>­-ое число Каталана равняется <tex> \frac{1}{n+1}{2 n \choose n} </tex> или асимптотически <tex> \frac{4^n}{n^{3/2}\sqrt{\pi}} </tex>.-->
=== Оптимизации динамическим программированием ===
Анонимный участник

Навигация