算法复习整理(第2版)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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中顶点对应的距离值

若存在,d(V0,Vi)为弧上的权值

若不存在,d(V0,Vi)为∞

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]0) then begin min:=lowcost[j];

k:=j;

end;

lowcost[k]:=0; {将顶点k 加入生成树}

{生成树中增加一条新的边k 到closest[k]}

{修正各点的lowcost 和closest 值}

for j:=1 to n do

if cost[k,j]

相关文档
最新文档