构造一组矩阵,分别用自然连乘的方式与动态规划求解方式对比,给出绝对运行时间(以毫秒为单位)差别明显,给出C++代码)
时间: 2024-03-12 12:48:59 浏览: 50
好的,我知道了。以下是一组矩阵的数据:
```
int p[5] = {10, 100, 5, 50, 1}; // 矩阵链的规模数组
// 矩阵链连乘的自然连乘方式
int MatrixChainOrder_natural(int p[], int n) {
int m[n][n];
memset(m, 0, sizeof(m));
for (int len = 2; len < n; len++) {
for (int i = 1; i < n - len + 1; i++) {
int j = i + len - 1;
m[i][j] = INT_MAX;
for (int k = i; k <= j - 1; k++) {
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q;
}
}
}
}
return m[1][n - 1];
}
// 矩阵链连乘的动态规划方式
int MatrixChainOrder_dp(int p[], int n) {
int m[n][n];
memset(m, 0, sizeof(m));
for (int len = 2; len < n; len++) {
for (int i = 1; i < n - len + 1; i++) {
int j = i + len - 1;
m[i][j] = INT_MAX;
for (int k = i; k <= j - 1; k++) {
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q;
}
}
}
}
return m[1][n - 1];
}
int main() {
int n = 5;
auto start1 = chrono::high_resolution_clock::now();
int result1 = MatrixChainOrder_natural(p, n);
auto end1 = chrono::high_resolution_clock::now();
auto duration1 = chrono::duration_cast<chrono::microseconds>(end1 - start1);
cout << "自然连乘的运行时间为:" << duration1.count() << "微秒" << endl;
auto start2 = chrono::high_resolution_clock::now();
int result2 = MatrixChainOrder_dp(p, n);
auto end2 = chrono::high_resolution_clock::now();
auto duration2 = chrono::duration_cast<chrono::microseconds>(end2 - start2);
cout << "动态规划的运行时间为:" << duration2.count() << "微秒" << endl;
return 0;
}
```
由于矩阵规模较小,两种方式的运行时间都很短,可能只有几微秒。如果你需要测试更大的矩阵规模,可以将 `n` 的值增大,并且在计算时间时使用毫秒单位。
阅读全文