Изменения

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

Черновик:Перемножение матриц

76 байт добавлено, 19:41, 4 сентября 2022
м
rollbackEdits.php mass rollback
Одно из простых решений: ''меморизация''. Каждый раз, когда мы считаем минимальную стоимость на отрезке, мы сохраняем ответ. Когда у нас просят посчитать это ещё раз, то мы сразу же выдадим ответ и не будем пересчитывать. Хоть у нас <math> n^2/2 </math>
One simple solution is called memoization: each time we compute the minimum cost needed to multiply out a specific subsequenceОдно из простых решений — это меморизация. Каждый раз, когда мы считаем минимальную стоимость перемножения определенной подпоследовательности, we save itдавайте мы будем запоминать ответ. If we are ever asked to compute it again, we simply give the saved answerЕсли мы когда либо ещё раз захотим посчитать это ещё раз, and do not recompute itто мы уже будет иметь ответ и не будем пересчитывать. Since there are about n2Поскольку существует всего около <math>n^2/2 different subsequences</math>, where где ''n is the number of matrices'' — это количество матриц, the space required to do this is reasonableто память занимаемая программой будет не так велика. It can be shown that this simple trick brings the runtime down to Можно сказать, что с помощью этого простого трюка мы уменьшили асимптотику алгоритма с O(n3<math>2n</math>) from до O(2n<math>n^3</math>), which is more than efficient enough for real applicationsчто является достаточно эффективным для реальных приложений. This is top-down dynamic programming.Pseudocode (without memoization):
Псевдокод (без меморизации):
<pre>
 int dp[1000][1000];vector<pair<int, int> > v;// Matrix Ai has dimension pv[i].first — размер i-1той матрицы по горизонтали // v[i] x p.second — размер i-той матрицы по вертикали// dp[i] for [j] — меморизация на отрезке [i = 1..n, j)Matrix-Chain-Orderint matrixChainMultiplication(int p[]l, int r)
{
// length[p] = n + 1 n = p.length - 1;l — включая в отрезок // m[i,j] = Minimum number of scalar multiplications (i.e., cost)r — исключая из отрезка // needed to compute the matrix A if dp[il]A[i+1]...A[jr] = A[i..j]= -1 // cost is zero when multiplying one matrix for (i if l == r - 1; i <= n; i++) m dp[i,il][r] = 0; else for (L dp[l][r] =21000 * 1000 * 1000; L<=n; L++) { // L is chain length for (int i=l + 1; i<=n-L+1r; i++) { j = i+L-1; m dp[l][i,jr] = MAXINT; for min(k=i; k<=j-1; k++) { // q = cost/scalar multiplications q = mdp[i,kl] + m[k+1r],j] + pv[i-1l].first *pv[ki].first *pv[jr - 1]; if .second + matrixChainMultiplication(q < m[l, i,j]) { m[+ matrixChainMultiplication(i,j] = qr)); // s return dp[i,jl] = Second auxiliary table that stores k // k = Index that achieved optimal cost s[i,jr] = k; } } } }
}
</pre>
* Томас Х. Кормен и др. Алгоритмы: построение и анализ
* Sanjoy Dasgupta , Christos H. Papadimitriou, Umesh Vazirani Algorithms
 
[[Категория: Дискретная математика и алгоритмы]]
[[Категория:Динамическое_программирование]]
1632
правки

Навигация