Изменения

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

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

427 байт убрано, 19:41, 4 сентября 2022
м
rollbackEdits.php mass rollback
Одно из простых решений — это меморизация. Каждый раз, когда мы считаем минимальную стоимость перемножения определенной подпоследовательности, давайте мы будем запоминать ответ. Если мы когда либо ещё раз захотим посчитать это ещё раз, то мы уже будет иметь ответ и не будем пересчитывать. Поскольку существует всего около <math>n^2/2</math>, где ''n'' — это количество матриц, то память занимаемая программой будет не так велика. Можно сказать, что с помощью этого простого трюка мы уменьшили асимптотику алгоритма с O(<math>2n</math>) до O(<math>n^3</math>), что является достаточно эффективным для реальных приложений.
Псевдокод (без меморизации):
<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
правки

Навигация