请选择时期:
怀孕准备 怀孕 分娩 宝宝0-1岁 宝宝1-3岁 宝宝3-6岁

迪杰斯特拉算法是什么 迪杰斯特拉 算法

来源: 最后更新:22-12-22 06:04:16

导读:介绍  对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作

  介绍mnH宝宝百科网

  对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。mnH宝宝百科网

  Dijkstra能是干啥的?mnH宝宝百科网

  mnH宝宝百科网

Dijkstra算法详细(单源最短路径算法)


mnH宝宝百科网

  Dijkstra是用来求单源最短路径的mnH宝宝百科网

  就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra 算法计算 南京到图中所有节点的最短距离。mnH宝宝百科网

  单源什么意思?mnH宝宝百科网

  从一个顶点出发,Dijkstra算法只能求一个顶点到其他点的最短距离而不能任意两点。mnH宝宝百科网

  和 bfs 求的最短路径有什么区别?mnH宝宝百科网

  bfs 求的与其说是路径,不如说是 次数 。因为bfs他是按照队列一次一次进行加入相邻的点,而两点之间没有权值或者权值相等(代价相同)。处理的更多是偏向迷宫类的这种都是只能走邻居(不排除特例)。mnH宝宝百科网

  Dijkstra在处理具体实例的应用还是很多的,因为具体的问题其实带权更多一些。mnH宝宝百科网

  比如一个城市有多个乡镇,乡镇可能有道路,也可能没有,整个乡镇联通,如果想计算每个乡镇到a镇的最短路径,那么Dijkstra就派上了用场。mnH宝宝百科网

  算法分析mnH宝宝百科网

  对于一个算法,首先要理解它的 运行流程 。mnH宝宝百科网

  对于一个Dijkstra算法而言,前提是它的前提条件和环境:mnH宝宝百科网

  一个连通图,若干节点,节点可能有数值,但是 路径 一定有 权值 。并且路径 不能为负 。否则Dijkstra就不适用。mnH宝宝百科网

  Dijkstra的核心思想是贪心算法的思想。不懂贪心?mnH宝宝百科网

  贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。mnH宝宝百科网

  贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。mnH宝宝百科网

  对于贪心算法,在很多情况都能用到。下面举几个不恰当的例子!mnH宝宝百科网

  打个比方,吃自助餐,目标是吃回本,那么胃有限那么每次都仅最贵的吃。mnH宝宝百科网

  上学时,麻麻说只能带5个苹果,你想带最多,那么选五个苹果你每次都选最大的那个五次下来你就选的最重的那个。mnH宝宝百科网

  不难发现上面的 策略 虽然没有很强的理论数学依据 ,或者不太好说明。但是 事实规律就是那样 ,并且对于贪心问题大部分都需要 排序 ,还可能会遇到类排序。并且一个物体可能有多个属性,不同问题需要按照不同属性进行排序,操作。mnH宝宝百科网

  那么我们的 Dijkstra 是如何贪心的呢?对于一个点,求图中所有点的最短路径,如果没有正确的方法胡乱想确实很难算出来,并且如果暴力匹配复杂度呈指数级上升不适合解决实际问题。mnH宝宝百科网

  那么我们该怎么想呢?mnH宝宝百科网

  Dijkstra算法的前提:mnH宝宝百科网

  首先,Dijkstra处理的是带正权值的 有权图 ,那么,就需要一个 二维数组 (如果空间大用list数组)存储各个点到达( 边 )的权值大小。 (邻接矩阵或者邻接表存储)mnH宝宝百科网

  其次,还需要一个 boolean数组 判断那些点已经确定最短长度,那些点没有确定。 int数组 记录距离( 在算法执行过程可能被多次更新 )。mnH宝宝百科网

  需要 优先队列 加入 已经确定点的周围点 。每次抛出确定最短路径的那个并且确定最短,直到所有点路径确定最短为止。mnH宝宝百科网

  简单的概括流程为:mnH宝宝百科网

  一般从选定点开始抛入优先队列。(路径一般为0), boolean数组 标记0的位置(最短为0) , 然后0 周围连通的点 抛入优先队列中(可能是node类),并把各个点的距离记录到对应数组内( 如果小于就更新,大于就不动,初始第一次是无穷肯定会更新 ),第一次就结束了mnH宝宝百科网

  从队列中抛出 距离最近 的那个点 B ( 第一次就是0周围邻居 )。这个点距离一定是最近的(所有权值都是正的,点的距离只能越来越长。)标记这个点为 true , 并且将这个点的邻居加入队列 (下一次确定的最短点在前面未确定和这个点邻居中产生),并更新通过 B 点计算各个位置的长度,如果小于则更新!mnH宝宝百科网

  重复二的操作,直到所有点都确定。mnH宝宝百科网

  算法实现mnH宝宝百科网

  package 图论;mnH宝宝百科网

  import java.util.ArrayDeque;mnH宝宝百科网

  import java.util.Comparator;mnH宝宝百科网

  import java.util.PriorityQueue;mnH宝宝百科网

  import java.util.Queue;mnH宝宝百科网

  import java.util.Scanner;mnH宝宝百科网

  public class dijkstra {mnH宝宝百科网

  static class nodemnH宝宝百科网

  {mnH宝宝百科网

  int x; //节点编号mnH宝宝百科网

  int lenth;//长度mnH宝宝百科网

  public node(int x,int lenth) {mnH宝宝百科网

  this.x=x;mnH宝宝百科网

  this.lenth=lenth;mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  public static void main(String[] args) {mnH宝宝百科网

  int[][] map = new int[6][6];//记录权值,顺便记录链接情况,可以考虑附加邻接表mnH宝宝百科网

  initmap(map);//初始化mnH宝宝百科网

  boolean bool[]=new boolean[6];//判断是否已经确定mnH宝宝百科网

  int len[]=new int[6];//长度mnH宝宝百科网

  for(int i=0;i<6;i++)mnH宝宝百科网

  {mnH宝宝百科网

  len[i]=Integer.MAX_VALUE;mnH宝宝百科网

  }mnH宝宝百科网

  Queueq1=new PriorityQueue(com);mnH宝宝百科网

  len[0]=0;//从0这个点开始mnH宝宝百科网

  q1.add(new node(0, 0));mnH宝宝百科网

  int count=0;//计算执行了几次dijkstramnH宝宝百科网

  while (!q1.isEmpty()) {mnH宝宝百科网

  node t1=q1.poll();mnH宝宝百科网

  int index=t1.x;//节点编号mnH宝宝百科网

  int length=t1.lenth;//节点当前点距离mnH宝宝百科网

  bool[index]=true;//抛出的点确定mnH宝宝百科网

  count++;//其实执行了6次就可以确定就不需要继续执行了 这句可有可无,有了减少计算次数mnH宝宝百科网

  for(int i=0;i<map[index].length;i++)< p="">mnH宝宝百科网

  {mnH宝宝百科网

  if(map[index][i]>0&&!bool[i])mnH宝宝百科网

  {mnH宝宝百科网

  node node=new node(i, length+map[index][i]);mnH宝宝百科网

  if(len[i]>node.lenth)//需要更新节点的时候更新节点并加入队列mnH宝宝百科网

  {mnH宝宝百科网

  len[i]=node.lenth;mnH宝宝百科网

  q1.add(node);mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  for(int i=0;i<6;i++)mnH宝宝百科网

  {mnH宝宝百科网

  System.out.println(len[i]);mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  static Comparatorcom=new Comparator() {mnH宝宝百科网

  public int compare(node o1, node o2) {mnH宝宝百科网

  return o1.lenth-o2.lenth;mnH宝宝百科网

  }mnH宝宝百科网

  };mnH宝宝百科网

  private static void initmap(int[][] map) {mnH宝宝百科网

  map[0][1]=2;map[0][2]=3;map[0][3]=6;mnH宝宝百科网

  map[1][0]=2;map[1][4]=4;map[1][5]=6;mnH宝宝百科网

  map[2][0]=3;map[2][3]=2;mnH宝宝百科网

  map[3][0]=6;map[3][2]=2;map[3][4]=1;map[3][5]=3;mnH宝宝百科网

  map[4][1]=4;map[4][3]=1;mnH宝宝百科网

  map[5][1]=6;map[5][3]=3;mnH宝宝百科网

  }mnH宝宝百科网

  }mnH宝宝百科网

  执行结果:mnH宝宝百科网

  mnH宝宝百科网

Dijkstra算法详细(单源最短路径算法)


mnH宝宝百科网

  当然,dijkstra算法比较灵活,实现方式也可能有点区别,但是思想是不变的:一个贪心思路。dijkstra执行一次就能够确定一个点,所以只需要执行点的总和次数即可完成整个算法。mnH宝宝百科网


mnH宝宝百科网

标签: [db:关键词]  

免责声明:本文系转载,版权归原作者所有;旨在传递信息,其原创性以及文中陈述文字和内容未经本站证实。

本文地址:http://www.bbbaike.com/news/jiaodian/339099.html

  • 1她41岁当上副县长,却甘愿被商人围猎!中纪委最新披露……

    她41岁当上副县长,却甘愿被商人围猎!中纪委最新披露……

  • 22023年5月16日浙江省成品油价格按机制下调

    2023年5月16日浙江省成品油价格按机制下调

  • 3常州-10号柴油多少钱一升?(常州柴油价今日价格)

    常州-10号柴油多少钱一升?(常州柴油价今日价格)

  • 4银行卡忘记密码了怎么办 银行卡忘记密码了怎么办手机上

    银行卡忘记密码了怎么办 银行卡忘记密码了怎么办手机上

  • 5南阳卧龙区妇幼保健院九价疫苗开放预约

    南阳卧龙区妇幼保健院九价疫苗开放预约

  • 6户口迁城市的好处 户口迁城市有什么好处

    户口迁城市的好处 户口迁城市有什么好处

  • 7南阳卧龙区妇幼保健院520九价到苗消息

    南阳卧龙区妇幼保健院520九价到苗消息

  • 8征信记录怎么查看 征信记录怎么查看个人信息

    征信记录怎么查看 征信记录怎么查看个人信息

  • 9南阳卧龙区妇幼保健院二价疫苗开放预约

    南阳卧龙区妇幼保健院二价疫苗开放预约

  • 10洛阳毕业生团组织关系转接指南(洛阳市团组织关系转接)

    洛阳毕业生团组织关系转接指南(洛阳市团组织关系转接)

关于我们 | 广告服务 | 网站合作 | 免责声明 | 联系我们| 网站地图

© 2006-2022 宝宝百科网 all rights reserved.

声明: 本站文章均来自互联网,不代表本站观点 如有异议 请与本站联系 联系邮箱:kefu#bbbaike.com (请把#替换成@)