演算法設計與分析
實驗報告
題目一:矩陣相乘
題目二:最長公共子串行
題目一:矩陣相乘
一.問題描述
給定n個矩陣{a1,a2,... ,an},其中這n個矩陣是可相乘的,i=1,2,...,n-1。算出這n個矩陣的相乘積a1a2 。。。an。
補充:如果兩個矩陣a和b是可相乘的,那麼a的列數要和b的行數是相同的,否則,這兩個矩陣是不可相乘的。它們的相乘結果矩陣c的行數是a的行數,而列數是b的列數。
二.問題分析
由於矩陣乘法滿足結合律,故連乘積的計算可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。若乙個矩陣連乘積的計算次序已完全確定,也就是說該連乘積已完全加括號,則我們可以通過反覆呼叫兩個矩陣相乘的標準演算法計算出矩陣連乘積。
1.分析最優解的結構
為了方便起見,我們將矩陣連乘aiai+1 。。。aj記為a[i:j]。經分析,計算 a[1:n]的乙個最優次序所包含的計算矩陣子鏈a[1:k]和a[k:n]的次序也是最優的。因此,矩陣連乘計算次序問題的最優解包含著子問題的最優解。
2.建立遞迴關係
用矩陣m[n][n]來存放a[i:j]相乘的計算次數,用p[n+1]用來存放矩陣的行數和列數。
0 i=j
min= i
3.計算最優值
另外,用乙個陣列s[n][n]來記錄相應m[i][j]的分割下標
注:陣列元素的下標都是從0開始的,而不是1
void matrixchain(int *p, int n, int **m, int **s)
for(r = 1; r < n; r++) }
} }4.構造最優解
根據上一步的m和s中的值,構造出最優解。
void traceback(int i, int j, int **s)
traceback(i, s[i][j], s);
traceback(s[i][j]+1, j, s);
cout<<"multiply a"<
<<","<
cout<<"and a"<<(s[i][j] +1)<<","<
<
}
三.程式源**
使用c++語言來實現
#include
#include
#define x 10 //the count of array
#define m 10 //the row
#define n 10 //the column
#define stack_size 20
using namespace std;
void matrixchain(int *p, int n, int **m, int **s)
for(r = 1; r < n; r++)
}
}
}
}
void traceback(int i, int j, int **s)
traceback(i, s[i][j], s);
traceback(s[i][j]+1, j, s);
cout<<"multiply a"<
<<","<
cout<<"and a"<<(s[i][j] +1)<<","<
<
}
int main()
for(i = 0; i < x+1; i++)
}
if(!fin.is_open())
//read the data from the file
fin>>count;
for(pos = 0; pos < count; pos++)
matrixchain(p, count, m, s);
traceback(0, count-1, s);
fin.close();
for(i = 0; i < x+1; i++)
delete m;
delete s;
return 0;
}
四.輸入
輸入的乙個名為」data.in」的檔案,其中的乙個測試內容為:
5
4 5
5 3
3 3
3 4
4 6
五.輸出
在螢幕上輸出的結果是
multiply a0,0and a1,1
multiply a2,2and a3,3
multiply a2,3and a4,4
multiply a0,1and a2,4
題目二:最長公共子串行
一.問題描述
乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。在本題中,給定了兩個序列x和y,當另乙個序列z既是x的子串行又是y的子串行時,我們就稱z為x和y的公共子串行。當然這可能會有許多種,而我們又把其中最長的乙個稱為最長公共子串行。在本題中我們給了x和y的序列,要計算出x和y的最長公共子串行。
二.問題分析
1.最長公共子串行的結構
設序列x=,y=,它們的最長公共子串行是 z=,則
若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子串行
若xm≠yn,且zk≠xm,則z是xm-1和y的最長公共子串行
若xm≠yn,且zk≠yn,則z是x和yn-1的最長公共子串行
2.子問題的遞迴結構
0 i=0,j=0
c[i-1][j-1]+1 i,j>0;xi=yj
max i,j>0;xi≠yj
三.程式源**
使用c++語言來完成
#include
#include
#include
using namespace std;
#define n 100
ofstream fout;
void lcslength(int m, int n, char *x, char *y, int **c, int **b)
for(i = 1; i <= n; i++)
for(i = 1; i <= m; i++) else if(c[i-1][j] >= c[i][j-1]) else
}
}
}
void lcs(int i, int j, char *x, int **b)
if(b[i][j] == 0) else if(b[i][j] == 1) else
}
int main()
if(!fin.is_open())
fout.open("data.out");
if(!fout.is_open())
while(!fin.eof())
m = strlen(x);
n = strlen(y);
for(i = 0; i <= m; i++)
}
lcslength(m, n, x, y, c, b);
lcs(m, n, x, b);
fin.close();
fout.close();
delete x;
delete y;
for(i = 0; i < n; i++)
delete c;
delete b;
return 0;
}
四.輸入
檔案」data.in』』
sunjiangangoksunjiangnag
baixiaotongabasdfasfassunjiangns
五.輸出
檔案」data.out」
iangasunjiangn
0 給主人留下些什麼吧!~~
演算法分析與設計 回溯法實驗報告
演算法導論課程設計成績 題 目 回 溯 法 學院班級 1613013 學 號 16130130216 姓 名 庫 妍 主講教師 張立勇 日 期 2019.5.30 一 0 1 knapsack problem 1 實驗題目 運用回溯法實現實驗3中的0 1揹包問題 2 使用的演算法 回溯法3 演算法分...
演算法分析實驗報告02
演算法分析 斐波那契數列 第1,2兩個數為1,1.從第3個數開始,該數是其前面兩個數之和。利用遞迴設計演算法計算第20個斐波那契數。include using namespace std intfibonacci int n intmain 1.演算法分析 10!10 9 8 7 6 5 4 3 2...
演算法分析與設計實驗報告四 回溯法實驗
一 實驗目的 掌握回溯演算法思想 掌握回溯遞迴原理 了解回溯法典型問題 二 實驗內容 編寫乙個簡單的程式,解決8皇后問題。數字全排列問題 任意給出從1到n的n個連續的自然數,求出這n個自然數的各種全排列。如n 3時,共有以下6種排列方式 123,132,213,231,312,321。注意 數字不能...