知识大全 数据结构算法集锦

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数据库安装错误集锦

Oracle数据库安装错误集锦  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ◆如果你不能运行/

知识大全 ORACLE数据库的基本语法集锦

ORACLE数据库的基本语法集锦  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  表createt

知识大全 Oracle数据库备份与恢复精华资料集锦

Oracle数据库备份与恢复精华资料集锦  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!主要介绍了O

知识大全 PB开发Sybase数据库应用技巧集锦[2]

PB开发Sybase数据库应用技巧集锦[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 PB开发Sybase数据库应用技巧集锦[1]

PB开发Sybase数据库应用技巧集锦[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 数据结构之算法和算法分析[1]

  算法与数据结构的关系紧密在算法设计时先要确定相应的数据结构而在讨论某一种数据结构时也必然会涉及相应的算法下面就从算法特性算法描述算法性能分析与度量等三个方面对算法进行介绍  算法特性  算法(Al

知识大全 数据结构之算法和算法分析[2]

  算法与数据结构是相辅相承的解决某一特定类型问题的算法可以选定不同的数据结构而且选择恰当与否直接影响算法的效率反之一种数据结构的优劣由各种算法的执行来体现  要设计一个好的算法通常要考虑以下的要求 

知识大全 数据结构之算法和算法分析[4]

  一个算法是由控制结构和原操作构成的其执行时间取决于两者的综合效果为了便于比较同一问题的不同的算法通常的做法是从算法中选取一种对于所研究的问题来说是基本运算的原操作以该原操作重复执行的次数作为算法的

知识大全 数据结构之算法和算法分析[5]

  ⒉空间复杂度  一个程序的空间复杂度(Spaceplexity)是指程序运行从开始到结束所需的存储量  程序的一次运行是针对所求解的问题的某一特定实例而言的例如求解排序问题的排序算法的每次执行是对

知识大全 数据结构之算法和算法分析[3]

  为了解决理解与执行这两者之间的矛盾人们常常使用一种称为伪码语言的描述方法来进行算法描述伪码语言介于高级程序设计语言和自然语言之间它忽略高级程序设计语言中一些严格的语法规则与描述细节因此它比程序设计