Dijkstra的算法分析 (十万火急)

作者&投稿:笪寒 (若有异议请与网页底部的电邮联系)
Dijkstra算法问题~

dijkstra算法的时间复杂度是O(n²),
不妨设为kn²,其中次数小于1的项忽略
k(10×10)=10ms
那么k(40×40)=16[k×(10×10)]=160ms

我们可以用大O符号将Dijkstra算法的运行时间表示为边数m和顶点数n的函数。

Dijkstra算法最简单的实现方法是用一个链表或者数组来存储所有顶点的集合Q,所以搜索Q中最小元素的运算(Extract-Min(Q))只需要线性搜索Q中的所有元素。这样的话算法的运行时间是O(n2)。

对于边数少于n2稀疏图来说,我们可以用邻接表来更有效的实现Dijkstra算法。同时需要将一个二叉堆或者斐波纳契堆用作优先队列来寻找最小的顶点(Extract-Min)。当用到二叉堆的时候,算法所需的时间为O((m+n)log n),斐波纳契堆能稍微提高一些性能,让算法运行时间达到O(m + n log n)。相关问题和算法

在Dijkstra算法的基础上作一些改动,可以扩展其功能。例如,有时希望在求得最短路径的基础上再列出一些次短的路径。为此,可先在原图上计算出最短路径,然后从图中删去该路径中的某一条边,在余下的子图中重新计算最短路径。对于原最短路径中的每一条边,均可求得一条删去该边后子图的最短路径,这些路径经排序后即为原图的一系列次短路径。

OSPF(open shortest path first, 开放最短路径优先)算法是Dijkstra算法在网络路由中的一个具体实现。
与Dijkstra算法不同,Bellman-Ford算法可用于具有负花费边的图,只要图中不存在总花费为负值且从源点 s 可达的环路(如果有这样的环路,则最短路径不存在,因为沿环路循环多次即可无限制的降低总花费)。

与最短路径问题有关的一个问题是旅行商问题(traveling salesman problem),它要求找出通过所有顶点恰好一次且最终回到源点的最短路径。该问题是NP难的;换言之,与最短路径问题不同,旅行商问题不太可能具有多项式时间算法。

如果有已知信息可用来估计某一点到目标点的距离,则可改用A*算法,以减小最短路径的搜索范围。

  Dijkstra算法是单源最短路径问题的一种求解算法
  问题描述:在一个无向图中,有若干个点。某些点存在路径。如何从一个点到达另一个点使走的路程最短?
  它是运用贪心的算法不断添加点从而到达终点。建立一个集合,在代码中可以用来标记一下就可以。这个集合的初始时只有起点,我们把从源到u且中间只经过S中顶点的路程为从源到u的特殊路径,并用dist数组记录当前每个顶点所对应的最短特殊路径。Dijkstra算法从源出发,达到直接相连的点i,设为一层点,并把dist[i]赋为其权值。然后再检查与这几个点(除源点)相连的点,设为二层点,二层点中可能有一层点,比较一下源点直接到该点的路程和源点间接到达该点路程,修改dist[],直到找到终点。
  其中和prim算法有点相似,又和BFS有点相似。
  void Dijkstra(int n,int v,int dist[],int prev[],int **table){
  //其中n指n个节点,v指起点,dist[i]记录源点到i点的最短特殊路径,prev[i]记录在特殊路径当中i点的前一个点,table[][]就是无向图的邻接矩阵
  int i,j,k;
  bool s[maxint]; //maxint是个非常大的数
  for (i=1;i<=n;++i)
  {
  dist[i] = table[v][i];
  s[i] = false;
  if (dist[i] == maxint) prev[i] = 0; //将该点的前一个点赋为0,应为它不与v点直接相连
  else prev[i] = v;
  }
  dist[v] = 0; s[v] = true; //与prim不同的是初始时从源点出发
  for (i=1;i<n;++i)
  {
  int temp = maxint;
  int u = v;
  for (j=1;j<=n;++j)
  {
  if ((!s[j])&&(dist[j]<temp))
  {
  u = j;
  temp = dist[j];
  }
  }
  s[u] = true;
  for (j=1;j<=n;++j)
  {
  if ((!s[j])&&table[u][j]<maxint)
  {
  int newdist = dist[u] + table[u][j]; //newidist为从源点到该点的最短特殊路径
  if (newdist<dist[j])
  {
  dist[j] = newdist;
  prev[j] = u;
  }
  }
  }
  }
  }


字符串的展开
printf("%c",a[x]+i-'a'+'A');} } } if(p3==2){ for(i=1;i<(a[y]-a[x]);i++){ for(j=0;j<p2;j++){

NOIP2007提高组复赛试题
每取一个数的得分:所取数的数值乘以2^i,i表示这是第i轮取数。矩阵中的数为不超过100的自然数,1<=n,m<=80 样例输入:2 3 1 2 3 3 4 2 样例输出:82 样例说明:1*2+2*2 + 2*4+3*4 + 3*8+4*8 = 82 第四题:core 树网的核 树上的任两点间都有唯一路径。定义某一点到树...

字符串展开,老是WA,求解救~~
for(jj=1;jj<=p2;jj++)d[l++] = ii;else if(p3 == 1)for(ii=c[i-1]+1;ii<=c[i+1]-1;ii++)for(jj=1;jj<=p2;jj++)d[l++] = ii;} else if(p1 == 2){ if(p3 == 2&& !(c[i-1]>='0'&&c[i-1]<='9')&&!(c[i+1]>='0'&&c[i+1]<='9'))for(ii...

兰州市13814651938: Dijkstra的算法分析 (十万火急) -
夷溥盐酸: Dijkstra算法是单源最短路径问题的一种求解算法 问题描述:在一个无向图中,有若干个点.某些点存在路径.如何从一个点到达另一个点使走的路程最短? 它是运用贪心的算法不断添加点从而到达终点.建立一个集合,在代码中可以用来标...

兰州市13814651938: Dijkstra算法问题求从某源点到其余各顶点的Dijkstra算法,当图的顶点数为10,用邻接矩阵表示图时计算时间约为10ms,则当图的顶点数为40时,计算时间... -
夷溥盐酸:[答案] dijkstra算法的时间复杂度是O(n²), 不妨设为kn²,其中次数小于1的项忽略 k(10*10)=10ms 那么k(40*40)=16[k*(10*10)]=160ms

兰州市13814651938: 迪杰斯特拉算法的本质是贪心还是动态规划 -
夷溥盐酸: 我认为 Dijkstra算法 的本质是 广度优先搜索,而此处的广度是定义在路程的cost之上的.(就好比从圆心处向外扩散一个圆环,首次碰到的就是最zhidao近) 动态规划泛指,重叠子问题与原问题的推算关系(学名:动态转移方程),贪心是极端情况的动态规划,子问题独一选择性.Dijkstra算法的分解思路是 到达某节点的cost最小路径 --(从这里面选)--> { 到达其相邻节点的cost最小路径 } 独一选择性:只挑选: Min {到达其相邻节点的最短路径} 结论:的确是贪心策略 请采纳.

兰州市13814651938: 迪杰斯克拉算法是怎样的? -
夷溥盐酸: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式.注意该算法要求图中不存在负权边.

兰州市13814651938: 数学建模的十大算法 -
夷溥盐酸: Dijkstra算法 Floyd算法 分治算法 概率算法 聚类算法 遗传算法 组合算法 免疫算法 搜索算法 贪婪算法

兰州市13814651938: 迪杰斯特拉算法的通俗描述 -
夷溥盐酸: Dijkstra算法如果不用斐波那契堆优化的话,一般是没有加了SLF的SPFA快.而且局限性太大(要求边权为正),普适性差.

兰州市13814651938: dijikstra最短路径长度的算法 -
夷溥盐酸: Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. Dijkstra算法...

兰州市13814651938: C语言数据结构关于dijkstra算法 -
夷溥盐酸: 你用一个数组 dist 记录最短路径长,用另一个数组 pre 记录直接前驱.关键语句如下: if (dist[j] > dist[i] + edge[i, j]) {dist[j] = dist[i] + edge[i, j];pre[j] = i; } 这样就行了.

兰州市13814651938: dijkstra算法是什么? -
夷溥盐酸: 迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题.算法构思很是巧妙(我这么认为),简直达到了“无心插柳柳成荫”的境界.算法本...

兰州市13814651938: 算法手记Dijkstra双栈算术表达式求值算法 -
夷溥盐酸: 这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app.编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网