Изменения

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

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

41 байт добавлено, 08:42, 10 декабря 2011
Перебор всех вариантов
=== Перебор всех вариантов ===
Сначала, давайте считать тоопределимся, что мы хотим знать узнать минимальное количесвто количество операций (или минимальную стоимость), необходимых для перемножения матриц. Если мы перемножаем только две матрицы, то мы можем осуществить это только едиственным способом, следовательно минимальная стоимость — это стоимость этого перемноженияэтих двух матриц. В общем, мы можем найти минимальную стоимость используя следующий рекурсивный алгоритм:
* Взять последовательность матриц и разделить её на две части.
* Сделать это для каждой возможной позиции в последовательности, в которой она может быть разделена и взять минимум среди всех результатов.
Например, если у нас есть четыре матрицы ''ABCD'', то мы посчитаем для (''A'')(''BCD''), (''AB'')(''CD''), и (''ABC'')(''D''), делая рекурсивные вызовы, чтобы найти минимальную стоимость на отрезках ''ABC'', ''AB'', ''CD'', и ''BCD'', чтобы найти минимальную стоимость. Потом среди них мы выбираем лучший вариант. Так же, этот алгоритм дает не только минимальную стоимость, но и показывает наилучший способ перемножения матриц: нужно только сгрупировать тем же образомматрицы, каким дается нам минимальная стоимость и перемножить их между собой.
ВнезапноОднако, если мы применим этот алгоритм, то мы обнаружим, что это так же он работает также медленно, как и наивный способ перебирания всех скобочных последовательностей! Что пошло не так? Ответом на этот вопрос является то факт, что мы делаем много значительное количество ненужной работы. Например, в выше описанном алгоритме, мы сделали делали рекурсивный вызов, чтобы найти наилучшую стоимость для подсчета ''ABC'' и ''AB''. Но нахождение наилучшей стоимости для подсчета ''ABC'' так же требует нахождения лучшей стоимости для ''AB''. Так как рекурсия растет вглбь вглубь все больше и больше, то и число ненужных повторений увеличивается.
=== Динамическое программирование ===
90
правок

Навигация