分治法解决合并排序问题及动态规划解决矩阵连乘和最长公共子序列问题及贪心法解决哈夫曼编码问题Word文档下载推荐.docx
- 文档编号:14002302
- 上传时间:2022-10-16
- 格式:DOCX
- 页数:18
- 大小:78.99KB
分治法解决合并排序问题及动态规划解决矩阵连乘和最长公共子序列问题及贪心法解决哈夫曼编码问题Word文档下载推荐.docx
《分治法解决合并排序问题及动态规划解决矩阵连乘和最长公共子序列问题及贪心法解决哈夫曼编码问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《分治法解决合并排序问题及动态规划解决矩阵连乘和最长公共子序列问题及贪心法解决哈夫曼编码问题Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
[问题描述]
将n个元素排成非递减顺序。
[算法思路]
假如n为1,算法终止;
否如此,将n个待排元素分割成k(k=2)个大致相等子集合A,B,对每一个子集合分别递归排序,再将排好序的子集归并为一个集合。
根本思想:
将问题的求解过程化为多步选择,在每一步选择上,列出各种可能的结果(各子问题的可行解),舍去那些肯定不能成为最优解的局部解。
最后一步得到的解必是最优解。
求解过程多为自底向上,求解过程产生多个选择序列,下一步的选择依赖上一步的结果,总能得到最优解。
给定n个矩阵{A1,…,An},其中Ai与A(i-1)是可相乘的。
确定一个计算次序,使计算矩阵连乘积A1…An所需计算量最少。
例如,三个矩阵连乘,两种计算顺序(A*B)*C,A*(B*C)。
设A为100*1的矩阵,B为1*100的矩阵,C为100*1的矩阵,如此D=A*B为100*100的矩阵,需乘法次数为10000,D与C相乘,所需乘法次数为1000000,计算(A*B)*C的总时间长度为1010000。
E=B*C需乘法次数为10000,B*C为1*1的矩阵,E与A相乘,所需乘法数为100,计算A*(B*C)的时间长度只有10100。
计算(A*B)*C时,还需10000个单元来存储A*B,而A*(B*C)计算过程中,只需用1个单元来存储B*C。
将步骤化为多步,自底向上,先求出矩阵链长为1的最优计算次序,链长为2的最优次序,…
[最优解结构]
设A[1:
n]=A1…An,最优计算次序在Ak和A(k+1)连续开,如此总计算量=A[1:
k]的计算量+A[k+1:
n]的计算量+A[1:
k]*A[k+1:
n]如此矩阵子链A[1:
k]和A[k+1:
n]的计算次序也必最优。
[递推关系]
设计算A[i:
j]=Ai…Aj所需最少次数乘法为m[i][j],Ai的维数设为matrix[i].row*matrix[i].col。
[构造最优解]
记m[i][j]的断开位置k为s[i][j],在计算出m[i][j]后,可由s[i][j]递归构造相应的最优解。
字符序列的子序列是指从给定字符序列中随意地〔不一定连续〕去掉假如干个字符〔可能一个也不去掉〕后所形成的字符序列。
令给定的字符序列x=“x0,x1,…,x(m-1)〞,序列y=“y0,y1,…,y(k-1)〞是x的子序列,存在x的一个严格递增下标序列<
i0,i1,…,i(k-1)>
,使得对所有的j=0,1,…,k-1,有xij=yj。
引进一个二维数组c[][],用c[i][j]记录x[i]与y[j]的LCS的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。
由自底向上进展递推计算,那么在计算c[i,j]之前c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。
此时我们根据x[i]=y[j]还是x[i]!
=y[j],就可以计算出c[i][j]。
问题的递归式写成:
将问题的求解过程看作一系列选择,每次选择都是当前状态下的局部最优解。
每作一次选择后,所求问题会简化为一个规模更小的子问题。
从而通过每一步的最优解逐步达到整体最优解。
[问题描述]
通讯过程中需将传输的信息转换为二进制码。
由于英文字母使用频率不同,假如频率高的字母对应短的编码,频率低的字母对应长的编码,传输的数据总量就会降低。
要求找到一个编码方案,使传输的数据量最少。
哈夫曼编码就是一种最优编码方案。
1)以n个字母为结点构成n棵仅含一个点的二叉树集合,字母的频率即为结点的权。
2)每次从二叉树集合中找出两个权最小者合并为一棵二叉树:
增加一个根结点将这两棵树作为左右子树。
新树的权为两棵子树的权之和。
3)反复进展步骤2)直到只剩一棵树为止。
四、详细设计与实现
1、合并排序
例:
序列分解过程:
{8473652}
{8473}{652}
{84}{73}{65}{2}
初始序列aa[0]a[1]a[2]a[3]a[4]a[5]a[6]
{8}{4}{7}{3}{6}{5}{2}
排序后归并到b{48}{73}{65}{2}
复制到a{48}{73}{65}{2}
排序后归并到b{3478}{256}
复制到a{3478}{256}
排序后归并到b{2345678}
复制到a{2345678}
最终结果为:
{2345678}
C++实现代码为:
#include<
iostream>
usingnamespacestd;
voidMerge(inta[],intb[],intl,intm,intr)
{//合并a[l:
m]和b[m+1:
r]存入到b[l:
r]中
inti=l,j=m+1,k=l;
while((i<
=m)&
&
(j<
=r))
if(a[i]<
=a[j])b[k++]=a[i++];
elseb[k++]=a[j++];
if(i>
m)
for(intq=j;
q<
=r;
q++)
b[k++]=a[q];
else
for(intq=i;
=m;
b[k++]=a[q];
}
voidCopy(inta[],intb[],ints,intn)
{
for(inti=s;
i<
=n;
i++)
a[i]=b[i];
voidMergeSort(inta[],intleft,intright)
inti;
if(left<
right)//至少有2个元素
{
i=(left+right)/2;
//取中点
intb[100];
MergeSort(a,left,i);
//递归调用分别对两个字问题排序
MergeSort(a,i+1,right);
Merge(a,b,left,i,right);
//合并到数组b
Copy(a,b,left,right);
//复制回数组a
}
intmain()
inta[100];
intn,i;
cout<
<
"
输入元素个数n:
;
cin>
>
n;
输入一维数组a["
n<
]:
for(i=0;
cin>
a[i];
MergeSort(a,0,n-1);
输出排序为:
for(i=0;
cout<
a[i]<
'
'
endl;
return0;
运行截图:
2、矩阵连乘
A1
A2
A3
A4
A5
A6
30*35
35*15
15*5
5*10
10*20
20*25
结果为:
((A1(A2A3))((A4A5)A6))
C++实现代码:
#include<
#defineMAX100
structMatrix//矩阵
introw;
//矩阵行数
intcol;
//矩阵列数
};
//矩阵
Matrixmatrix[MAX];
//m[i][j]存储Ai到Aj的最小乘法次数
intm[MAX][MAX];
//s[i][j]存储Ai到Aj之间加括号的位置
ints[MAX][MAX];
//矩阵个数
intn;
voidMaxtrixChain(Matrixmatrix[MAX],intn,intm[MAX][MAX],ints[MAX][MAX])
{//计算m[][]和s[][]
for(intr=2;
r<
r++)
for(inti=1;
=n-r+1;
{
intj=i+r-1;
m[i][j]=m[i+1][j]+matrix[i].row*matrix[i].col*matrix[j].col;
s[i][j]=i;
for(intk=i+1;
k<
j;
k++)
{
intt=m[i][k]+m[k+1][j]+matrix[i].row*matrix[k].col*matrix[j].col;
if(t<
m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}
}
voidmatrixMultiply(Matrixmatrix[MAX],intn)
boolflag=false;
//标识矩阵的阶数是否要重新输入
cout<
请输入每个矩阵行数与列数:
for(i=1;
A"
行数:
matrix[i].row;
列数:
matrix[i].col;
//检查Ai的列数是否等于Ai+1的行数
if(matrix[i].col!
=matrix[i+1].row)
输入的矩阵不可乘,请重新输入!
flag=true;
break;
if(flag)
matrixMultiply(matrix,n);
//打印加括号后的
voidtraceback(inti,intj)
if(i==j)
i;
else
("
traceback(i,s[i][j]);
traceback(s[i][j]+1,j);
)"
voidmain()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分治 解决 合并 排序 问题 动态 规划 矩阵 最长 公共 序列 贪心 哈夫曼 编码
![提示](https://static.bdocx.com/images/bang_tan.gif)
链接地址:https://www.bdocx.com/doc/14002302.html