Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
1 / 1 / 0
Регистрация: 22.10.2013
Сообщений: 56

Задача об эффективном перемножении матриц

25.05.2014, 20:48. Показов 3920. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с алгоритмом об эффективном перемножении матриц(расстановка скобок).
Я понял что суть действия в том, что мы выбираем где разбить нашу последовательность матриц. далее мы вычисляем стоимость каждой из подпоследовательностей и суммируем = общая стоимость перемножения. Не очень понял как выбирается место где разбивать на 1м шаге?
Вот мы разбили, далее мы внутри каждой подпоследовательности выполняем все возможные расстановки скобок, и считаем при них стоимость каждой подпоследовательности? это звучит как то не очень правдоподобно. Не очень понял как происходит процесс сохранения стоимостей и положения скобок. Если это все же так далее мы бьем последовательность еще раз и повторяем все заново? (уже имея в памяти некоторые стоимости). и так в итоге выбираем наименьшую?

[]http://upload.wikimedia.org/math/b/c/1/bc10a0ddacf68b72db6454b5b5144ccb.png[/]
объясните пожалуйста пошагово как работает рекурсиваня формула.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class MatrixChain {
       /**
     * Возвращает ответ на задачу об оптимальном перемножении матриц, используя
         * динамическое программирование.
     * Асимптотика решения - O(N^3) время и O(N^2) память.
     *  
     * @param p  массив размеров матриц, см.статью   
     * @return   минимальное количество скалярных умножений, необходимое для решения задачи
     */ 
       public static int multiplyOrder(int[] p) {
        int n = p.length - 1;
        int[][] dp = new int[n + 1][n + 1];
 
        for (int i = 1; i <= n; i++) {
            dp[i][i] = 0;
        }
 
        for (int l = 2; l <= n; l++) {
            for (int i = 1; i <= n - l + 1; i++) {
                int j = i + l - 1;
                dp[i][j] = Integer.MAX_VALUE;
                for (int k = i; k <= j - 1; k++) {
                    dp[i][j] = Math.min(dp[i][j],
                                                   dp[i][k] + dp[k + 1][j] + p[i - 1] * p[k] * p[j]);
                }
            }
        }
        return dp[1][n]; 
    }
 
    public static void main(String[] args) {
        int[] test = { 10, 100, 5, 50 };
        System.out.println(MatrixChain.multiplyOrder(test));
    }
}
код с википедии не тащит. не понятны манипуляции с индексами.
Помогите пожалуйста! очень СРОЧНО нужно разобраться уже уйму времени читаю главу посвященную этому в книге "Алгоритмы построение и анализ" Но никак толком не могу понять(( Помогите, рассудите...

Добавлено через 14 минут
допустим если рассматривать на примере 6 матриц A1 A2 A3 A4 A5 A6 в рекурсивной формуле сказано следующее
что минимальная стоимость матрици А1..6 будет минимальная стоимость матрицы А1..k + А(k+1)...j но вопрос в том, как мы узнаем минимальныю стоимость А1..k и А(k+1)...j кроме как не подставив еще раз в формулу и получив А(k+1)..Ak1 + A(k1+1)..A6 так же и с первой подпоследовательностью. И к чему мы так придем? или все таки внутри этих подпоследовательностей нужно все возможные сочетания скобок смотреть и из них выбирать наименьшую стоимость, потом менять изначальное k и считать заново, пока не найдем значение k чтобы общая стоимость была наименьшей?

Добавлено через 1 минуту
Как выбирается вышеупомянутое k?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2014, 20:48
Ответы с готовыми решениями:

Ошибка в перемножении матриц
Имеется программка для перемножения матриц. void matrix_iter(double **mas_e, double **mas1, double **mas2, int size) { for (int...

Мусор при перемножении матриц
3дравствуйте, ошибка возникает,когда перемножаю матрицы a3;b3 и a2;b2; Они перемножаются, но там мусор.Ошибок на этапе компиляции нет....

Ошибка при перемножении матриц
Здравствуйте. При перемножении двух матриц, появляется лишний столбец. Никак не могу найти ошибку. Вот фрагмент кода: Есть три...

4
Эксперт функциональных языков программированияЭксперт по математике/физике
4311 / 2103 / 431
Регистрация: 19.07.2009
Сообщений: 3,187
Записей в блоге: 24
25.05.2014, 22:57
Лучший ответ Сообщение было отмечено AshleyLight как решение

Решение

Вы признаёте, что расстановка скобочек определяется последовательностью размерностей p0, p1, p2, ... , pn, где p[i] x p[i+1] есть размеры матрицы A[i] ?

Если так, то функция m[i,j] определяется естественно.
Так, m[i,i] = 0 для любого i.
Далее, m[i,i+1] = m[i,i]+m[i+1,i+1]+p[i-1]p[i]p[i+1] = p[i-1]p[i]p[i+1].
Далее, m[i,i+2] = min( m[i,i]+m[i+1,i+2]+p[i-1]p[i]p[i+2], m[i,i+1]+m[i+2,i+2]+p[i-1]p[i+1]p[i+2] ) = min(p[i]p[i+1]p[i+2] + p[i-1]p[i]p[i+2], p[i-1]p[i]p[i+1] + p[i-1]p[i+1]p[i+2]).

Продолжите дальше, чему равно m[i,i+3] для произвольного i?

В приведённом коде как раз это и делается: для каждого l = 0..n заполняются все элементы m[i,i+m], где i = 0..(n-l)
1
1 / 1 / 0
Регистрация: 22.10.2013
Сообщений: 56
25.05.2014, 23:13  [ТС]
Да, спасибо большое я уже разобрался, не мог понять что в рекурсивной формуле к пробегает все значения свои, и тем самым в каждом элементе матрицы m[i,j] кроме как i=j лежит наименьшая стоимость для произведения соответствующего диапазона матриц. и смысл динамического программирования тут как раз в в том чтобы после выбора наименьшего в следующем когда уже будет такая же расстановка скобок, её не считать! Спасибо большое за ответ, а то обычно мои посты на этом форме игнорят(

Добавлено через 8 минут
можете пояснить почему скорость именно О(n^3)?
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4311 / 2103 / 431
Регистрация: 19.07.2009
Сообщений: 3,187
Записей в блоге: 24
25.05.2014, 23:52
Лучший ответ Сообщение было отмечено AshleyLight как решение

Решение

Цитата Сообщение от AshleyLight Посмотреть сообщение
можете пояснить почему скорость именно О(n^3)?
Потому что перед нами три вложенных цикла:
внешний по l = 0..n, (n+1) итераций
средний по i = 0..n-l+1, (n-l+2) итераций
внутренний по k = i..i+l-2, (l-1) итераций

Всего действий:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{l=0}^{n} \sum_{i=0}^{n-l+1} l-1 = \sum_{l=0}^n (n-l+2)(l-1) = \frac16 (1+n) (-12+2 n+n^2)
1
1 / 1 / 0
Регистрация: 22.10.2013
Сообщений: 56
26.05.2014, 00:16  [ТС]
Справедливо, спасибо, весьма благодарен за уделенное внимание!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2014, 00:16
Помогаю со студенческими работами здесь

Свойство ассоциативности при перемножении матриц
Народ. Не могу понять одну вещь. Я сейчас с координатными преобразованиями завис, причём с основами. Есть свойство ассоциативности...

Ошибка при перемножении квадратных матриц
Написал такую прогу. По выбору складывает, вычитает, или умножает матрицы. При перемножении (конец программы) если обе матрицы не...

Ошибка вывода при перемножении матриц
Здравствуйте! Программирую на C++ совсем недавно, столкнулся с проблемой, при выводе матрицы. Вместо результата перемножения двух матриц (...

При перемножении матриц ошибка с памятью
Написал класс матрица с алгоритмом умножения, но при выходе из проги выбивает ошибку. Не пойму как написать деструктор. Подскажите как...

Программа, которая оптимальным образом расставляет скобки при перемножении матриц
Пожалуйста помогите написать программу, которая оптимальным образом расставляет скобки при перемножении матриц. Размерности матриц считать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru