- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大连理工大学算法分析与设计
5、 已知一有向图G=(V,E),其每条边(u,v)∈E均对应有一个实数值r(u,v),表示从顶点u到顶点v之间的通信线路的可靠性,取值范围为0≤r(u,v)≤1,定义r(u,v)为从u到v的线路不中断的概率,并假定这些概率是相互独立的。写出一个有效算法,来找出两个指定顶点间的最可靠的线路。
解答:
运用Dijkstra算法的思想,将原来的加法计算改为乘法即可。
例如下图:
解答过程如下:
每一行的意义:从A出发,经过所用可能路径,
到达各点的最可靠效率
第一次找到B之后,就不用再找了,
因为再乘以任何r(u,v)([0-1])
会使得A到B的可靠性减小;6、 Floyd算法求出任意两点间的最短距离。
例:有向图中有四个点,点之间的距离如下所示:
解答:
for(k=0;kn;k++)
for(i=0;in;i++)
for(j=0;jn;j++)
A [ i,j ] = min { A [ i,j ],A [ i,k ] + A [ k,j ] }
算法思想:
从图的带权邻接矩阵A=[a(i,j)] n×n开始,
递归地进行n次更新,即由矩阵D(0)=A,
按一个公式,构造出矩阵D(1);
又用同样地公式由D(1)构造出D(2);
最后又用同样的公式由D(n-1)构造出矩阵D(n)。
矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度;9、对于矩阵乘法: 第1个乘号 第(n-1)个乘号 A1 × A2 × … × And0 × d1 d1 × d2 dn-1 × dn给出每个乘法运算的执行顺序,使得进行整个矩阵乘法运算过程中进行的数值乘法次数最少。;伪代码实现:;对root数组进行如下的后序遍历,即可得到代价最少的乘法次序,乘法进行的次序存储在数组multOrder[]中
int multOrderNext;
extractOrderWrap(int n, int root[], multOrder[])
{
multOrderNext = 1;
extractOrder(1, n, multOrder);
}
extractOrder(int low, int high, int root[], int multOrder[])
{
Int k;
If (low high)
k = root[low][high];
extractOrder(low, k, multOrder);
extractOrder(k+1, high, multOrder);
multOrder[multOrderNext] = k;
multOrderNext++;
};举例:;
C13 = C11 + C23 + 30×1×10 = 700 ok
C12 + C33 + 30×40×10 = 13200
R13 = 1
C24 = C22 + C34 + 1×40×25 = 11000
C23 + C44 + 1×10×25 = 650 ok
R24 = 3
C14 = C11 + C24 + 30×1×25 = 1400 ok
C12 + C34 + 30×40×25 1400
C13 + C44 + 30×10×25 1400
R14 = 1
所以最小代价C14 = 1400
;10、给定长度为n的有序元素序列K1, K2, …,Kn,其各个元素被查找的概率(或频率)分别为p1,p2, …, pn。描述构造最优二分树的算法;伪代码实现:
定义两个二维数组cost[1...n+1][0…n]和root[1…n+1][0…n]
// 初始化数组的对角线元素,即(t+1, t)
for( i=1; i=n+1; i++ )
cost[i][i-1] = 0;
root[i][i-1] = -1;
// 按一定的顺序填充数组
for( low=n; low=1; low-- )
for( high=low; high=n; high++)
cost[low][high] = maxNum;//maxNum表示无穷大
for (k=low; k=high; k++)//选取不同的元素作为当前树的树根
currentCost = low…high的概率和 + cost(low, k-1) + cost(
文档评论(0)