知识大全 数据结构算法集锦
Posted 结点
篇首语:当你毫无保留地信任一个人,最终只会有这两种结果,不是生命中的那个人,就是生命中的一堂课。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构算法集锦相关的知识,希望对你有一定的参考价值。
一 数论算法
求两数的最大公约数
function gcd(a b:integer):integer;
begin
if b= then gcd:=a
else gcd:=gcd (b a mod b);
end ;
求两数的最小公倍数
function lcm(a b:integer):integer;
begin
if a
lcm:=a;
while lcm mod b> do inc(lcm a);
end;
素数的求法
A 小范围内判断一个数是否为质数
function prime (n: integer): Boolean;
var I: integer;
begin
for I:= to trunc(sqrt(n)) do
if n mod I= then begin
prime:=false; exit;
end;
prime:=true;
end;
B 判断longint范围内的数是否为素数(包含求 以内的素数表)
procedure getprime;
var
i j:longint;
p:array[ ] of boolean;
begin
fillchar(p sizeof(p) true);
p[ ]:=false;
i:= ;
while i< do begin
if p[i] then begin
j:=i* ;
while j< do begin
p[j]:=false;
inc(j i);
end;
end;
inc(i);
end;
l:= ;
for i:= to do
if p[i] then begin
inc(l);pr[l]:=i;
end;
end;getprime
function prime(x:longint):integer;
var i:integer;
begin
prime:=false;
for i:= to l do
if pr[i]>=x then break
else if x mod pr[i]= then exit;
prime:=true;
end;prime
二 图论算法
最小生成树
A Prim算法
procedure prim(v :integer);
var
lowcost closest:array[ maxn] of integer;
i j k min:integer;
begin
for i:= to n do begin
lowcost[i]:=cost[v i];
closest[i]:=v ;
end;
for i:= to n do begin
寻找离生成树最近的未加入顶点k
min:=maxlongint;
for j:= to n do
if (lowcost[j] ) then begin
min:=lowcost[j];
k:=j;
end;
lowcost[k]:= ; 将顶点k加入生成树
生成树中增加一条新的边k到closest[k]
修正各点的lowcost和closest值
for j:= to n do
if cost[k j]
lowcost[j]:=cost[k j];
closest[j]:=k;
end;
end;
end;prim
B Kruskal算法 (贪心)
按权值递增顺序删去图中的边 若不形成回路则将此边加入最小生成树
function find(v:integer):integer; 返回顶点v所在的集合
var i:integer;
begin
i:= ;
while (i<=n) and (not v in vset[i]) do inc(i);
if i<=n then find:=i else find:= ;
end;
procedure kruskal;
var
tot i j:integer;
begin
for i:= to n do vset[i]:=[i];初始化定义n个集合 第I个集合包含一个元素I
p:=n ; q:= ; tot:= ; p为尚待加入的边数 q为边集指针
sort;
对所有边按权值递增排序 存于e[I]中 e[I] v 与e[I] v 为边I所连接的两个顶点的序号 e[I] len为第I条边的长度
while p> do begin
i:=find(e[q] v );j:=find(e[q] v );
if i<>j then begin
inc(tot e[q] len);
vset[i]:=vset[i]+vset[j];vset[j]:=[];
dec(p);
end;
inc(q);
end;
writeln(tot);
end;
最短路径
A 标号法求解单源点最短路径
var
a:array[ maxn maxn] of integer;
b:array[ maxn] of integer; b[i]指顶点i到源点的最短路径
mark:array[ maxn] of boolean;
procedure bhf;
var
best best_j:integer;
begin
fillchar(mark sizeof(mark) false);
mark[ ]:=true; b[ ]:= ; 为源点
repeat
best:= ;
for i:= to n do
If mark[i] then 对每一个已计算出最短路径的点
for j:= to n do
if (not mark[j]) and (a[i j]> ) then
if (best= ) or (b[i]+a[i j]
best:=b[i]+a[i j]; best_j:=j;
end;
if best> then begin
b[best_j]:=best;mark[best_j]:=true;
end;
until best= ;
end;bhf
B Floyed算法求解所有顶点对之间的最短路径
procedure floyed;
begin
for I:= to n do
for j:= to n do
if a[I j]> then p[I j]:=I else p[I j]:= ; p[I j]表示I到j的最短路径上j的前驱结点
for k:= to n do 枚举中间结点
for i:= to n do
for j:= to n do
if a[i k]+a[j k]
a[i j]:=a[i k]+a[k j];
p[I j]:=p[k j];
end;
end;
C Dijkstra 算法
var
a:array[ maxn maxn] of integer;
b pre:array[ maxn] of integer; pre[i]指最短路径上I的前驱结点
mark:array[ maxn] of boolean;
procedure dijkstra(v :integer);
begin
fillchar(mark sizeof(mark) false);
for i:= to n do begin
d[i]:=a[v i];
if d[i]<> then pre[i]:=v else pre[i]:= ;
end;
mark[v ]:=true;
repeat 每循环一次加入一个离 集合最近的结点并调整其他结点的参数
min:=maxint; u:= ; u记录离 集合最近的结点
for i:= to n do
if (not mark[i]) and (d[i]
u:=i; min:=d[i];
end;
if u<> then begin
mark[u]:=true;
for i:= to n do
if (not mark[i]) and (a[u i]+d[u]
d[i]:=a[u i]+d[u];
pre[i]:=u;
end;
end;
until u= ;
end;
计算图的传递闭包
Procedure Longlink;
Var
T:array[ maxn maxn] of boolean;
Begin
Fillchar(t sizeof(t) false);
For k:= to n do
For I:= to n do
For j:= to n do T[I j]:=t[I j] or (t[I k] and t[k j]);
End;
无向图的连通分量
A 深度优先
procedure dfs ( now color: integer);
begin
for i:= to n do
if a[now i] and c[i]= then begin 对结点I染色
c[i]:=color;
dfs(I color);
end;
end;
B 宽度优先(种子染色法)
关键路径
几个定义 顶点 为源点 n为汇点
a 顶点事件最早发生时间Ve[j] Ve [j] = max Ve [j] + w[I j] 其中Ve ( ) = ;
b 顶点事件最晚发生时间 Vl[j] Vl [j] = min Vl[j] – w[I j] 其中 Vl(n) = Ve(n);
c 边活动最早开始时间 Ee[I] 若边I由表示 则Ee[I] = Ve[j];
d 边活动最晚开始时间 El[I] 若边I由表示 则El[I] = Vl[k] – w[j k];
若 Ee[j] = El[j] 则活动j为关键活动 由关键活动组成的路径为关键路径
求解方法
a 从源点起topsort 判断是否有回路并计算Ve;
b 从汇点起topsort 求Vl;
c 算Ee 和 El;
拓扑排序
找入度为 的点 删去与其相连的所有边 不断重复这一过程
例 寻找一数列 其中任意连续p项之和为正 任意q 项之和为负 若不存在则输出NO
回路问题
Euler回路(DFS)
定义 经过图的每条边仅一次的回路 (充要条件 图连同且无奇点)
Hamilton回路
定义 经过图的每个顶点仅一次的回路
一笔画
充要条件 图连通且奇点个数为 个或 个
判断图中是否有负权回路 Bellman ford 算法
x[I] y[I] t[I]分别表示第I条边的起点 终点和权 共n个结点和m条边
procedure bellman ford
begin
相关参考
Oracle数据库安装错误集锦 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ◆如果你不能运行/
ORACLE数据库的基本语法集锦 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 表createt
Oracle数据库备份与恢复精华资料集锦 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!主要介绍了O
PB开发Sybase数据库应用技巧集锦[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
PB开发Sybase数据库应用技巧集锦[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
算法与数据结构的关系紧密在算法设计时先要确定相应的数据结构而在讨论某一种数据结构时也必然会涉及相应的算法下面就从算法特性算法描述算法性能分析与度量等三个方面对算法进行介绍 算法特性 算法(Al
算法与数据结构是相辅相承的解决某一特定类型问题的算法可以选定不同的数据结构而且选择恰当与否直接影响算法的效率反之一种数据结构的优劣由各种算法的执行来体现 要设计一个好的算法通常要考虑以下的要求
一个算法是由控制结构和原操作构成的其执行时间取决于两者的综合效果为了便于比较同一问题的不同的算法通常的做法是从算法中选取一种对于所研究的问题来说是基本运算的原操作以该原操作重复执行的次数作为算法的
⒉空间复杂度 一个程序的空间复杂度(Spaceplexity)是指程序运行从开始到结束所需的存储量 程序的一次运行是针对所求解的问题的某一特定实例而言的例如求解排序问题的排序算法的每次执行是对
为了解决理解与执行这两者之间的矛盾人们常常使用一种称为伪码语言的描述方法来进行算法描述伪码语言介于高级程序设计语言和自然语言之间它忽略高级程序设计语言中一些严格的语法规则与描述细节因此它比程序设计