算法复习整理(第2版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改进算法和提高计算机处理能力对算法速度的影响(课堂上讲过相关提高算法效率的实例)
上界证明
快速排序
矩阵连乘问题
TSP问题(Dijkstra算法)
按路径长度递增次序产生算法:
把顶点集合V分成两组:
(1)S:已求出的顶点的集合(初始时只含有源点V0)
(2)V-S=T:尚未确定的顶点集合
将T中顶点按递增的次序加入到S中,保证:
(1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度
(2)每个顶点对应一个距离值
S中顶点:从V0到此顶点的长度
T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
依据:可以证明V0到T中顶点Vk的,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
(反证法可证)
求最短路径步骤
算法步骤如下:
1. 初始时令S={V0},T={其余顶点},T中顶点对应的距离值
若存在
若不存在
2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止
下面是该算法的C语言实现
1 #include
2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #include
#definemax1000000000;
inta[1000][1000],d[1000],p[1000];//d表示某特定边距离,p表示永久边距离intmain(){
inti,j,k,m,n,sum=0;//m代表边数,n代表点数
intx,y,z;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
for(i=1;i<=n;i++)d[i]=max;
d[1]=0;
for(i=1;i<=n;i++){
intmin=max;
for(j=1;j<=n;j++)
if(!p[j]&&d[j] min=d[j]; k=j; } p[k]=1; for(j=1;j<=n;j++) if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j]) d[j]=d[k]+a[k][j]; } for(i=1;i<=n;i++) printf("%d",d[i]); system("pause"); return0; } 图着色问题 最小生成树问题 (需要知道最小生成树如何生成) PPT上都有算法看懂即可、 证明使用贪心法可以获得最优解。 例:最小生成树的生成步骤。 求MST的一般算法可描述为:针对图G,从空树T开始,往集合T中逐条选择并加入n-1条安全边(u,v),最终生成一棵含n-1条边的MST。 当一条边(u,v)加入T时,必须保证T∪{(u,v)}仍是MST的子集,我们将这样的边称为T的安全边。 伪代码 GenerieMST(G){//求G的某棵MST T〈-¢;//T初始为空,是指顶点集和边集均空 while T未形成G的生成树do{ 找出T的一条安全边(u,v);//即T∪{(u,v)}仍为MST的子集 T=T∪{(u,v)};//加入安全边,扩充T } return T;//T为生成树且是G的一棵MST } 注意: 下面给出的两种求MST的算法均是对上述的一般算法的求精,两算法的区别仅在于求安全边的方法不同。 为简单起见,下面用序号0,1,…,n-1来表示顶点集,即是: V(G)={0,1,…,n-1}, G中边上的权解释为长度,并设T=(U,TE)。 求最小生成树的具体算法(pascal): Prim算法 procedure prim(v0:integer); var lowcost,closest:array[1..maxn] of integer; i,j,k,min:integer; begin for i:=1 to n do begin lowcost[i]:=cost[v0,i]; closest[i]:=v0; end; for i:=1 to n-1 do begin {寻找离生成树最近的未加入顶点k} min:=maxlongint; for j:=1 to n do if (lowcost[j] k:=j; end; lowcost[k]:=0; {将顶点k 加入生成树} {生成树中增加一条新的边k 到closest[k]} {修正各点的lowcost 和closest 值} for j:=1 to n do if cost[k,j]