Dijkstrala算法

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

Dijkstrala算法查找图中从一个节点到另一个节点的最短路径,输出结果是最短路径以及长度。算法执行的前提条件是权重不能是负数。

起始顶点记为sid,目的节点记为tid。

数组predecessor记录了最短路径上一个节点的前驱节点。例如predecessor[3]=5,就是从节点5到节点3的路径最短。

节点Vertext,保存节点id、当前节点距离sid的最短路径值。

优先队列queue按照节点的距离排序,在堆顶的是距离值最小的节点。

每次处理一个节点node的时候,处理其每条边,计算每条边的目的节点vertexts[to].dist。如果vertexts[to].dist>vertexts[node.id].dist + 边的权重,则表示有新的最短路径,更新,并且将目的节点加入到队列中。

因为可能有多条边达到同一个节点,所以队列中可能有多个元素表示同一个节点,会有多余的操作。解决此问题可以自己写一个优先队列,实现更新元素。参考代码。

import java.util.*;public class Graph {//顶点数量private int v;//链接表private LinkedList<Edge> adjacency[];/*** 构造顶点数为v的图* @param v*/public Graph(int v) {this.v = v;adjacency = new LinkedList[v];for(int i=0;i<v;i++){adjacency[i] =  new LinkedList<>();}}/*** 添加一条边* @param sid*          源节点id* @param tid*          目的节点id* @param weight*          权重*/public void addEdge(int sid, int tid,int weight){Edge edge = new Edge(sid,tid,weight);adjacency[sid].add(edge);}/*** 计算从sid到tid的最短路径。返回值是经过路径的节点id* @param sid* @param tid* @return*/public List<Integer> dijkstrala(int sid ,int tid){Vertext[] vertexts = new Vertext[v];for(int i=0; i < v;i++){vertexts[i] = new Vertext(i);}vertexts[sid].dist = 0;//predecessor[i]=得到i的前驱节点int[] predecessor = new int[v];predecessor[sid] = -1;PriorityQueue<Vertext> queue = new PriorityQueue<>(this.v,new Comparator<Vertext>(){public int compare(Vertext o1, Vertext o2){return o1.dist - o2.dist;}});//队列中可能存在重复节点,会存在多余操作queue.offer(vertexts[sid]);while(! queue.isEmpty()){Vertext node = queue.poll();if(node.id == tid) break;if(adjacency[node.id]!=null){for(Edge edge : adjacency[node.id]){int to = edge.tid;if(vertexts[node.id].dist + edge.weight < vertexts[to].dist){vertexts[to].dist = vertexts[node.id].dist + edge.weight;queue.add(vertexts[to]);predecessor[to] = node.id;}}}}List<Integer> path = new ArrayList<Integer>();if(vertexts[tid].dist < Integer.MAX_VALUE){visitPredecessor(predecessor,tid,path);Collections.reverse(path);}return path;}private void visitPredecessor(int[] predecessor, int tid,List<Integer> path) {path.add(tid);if(predecessor[tid] != -1){visitPredecessor(predecessor,predecessor[tid],path);}}private class Vertext{//编号private int id;//距离private int dist = Integer.MAX_VALUE;public Vertext(int id) {this.id = id;}}private class Edge{private int sid;private int tid;private int weight;public Edge(int sid, int tid, int weight) {this.sid = sid;this.tid = tid;this.weight = weight;}}
}

时间复杂度是:O(ElogV)。程序主体是一个while循环,里面是一个for循环。因为每次for循环次数不定,但是所有for循环执行次数之和不会超过E(边的个数)。换句话说第一个执行E0、第二次执行E1、…第V次执行EV,E0+E1+…+Ev=E。(这里先假设队列中每个节点只有一个元素)
for循环里面是队列的入队、出队操作。假设队列中每个节点只有一个元素,那么队列不会超过V。所以入队、出队操作时间复杂度logV。那么总的时间复杂度是O(E
logV)。

队列中有重复元素,队列的最大不会超过E。那入队、出队操作时间复杂度是logE。E<=V2E<=V^2E<=V2,logE<=2logVlogE<=2logVlogE<=2logV。总时间复杂度还是O(E*logV)这个级别。如果在稀疏图中,这个时间复杂度是可以接受的。但在某些情况下会很糟糕。可以考虑在队列中更新节点。参考代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表题目汇总(python3)

1、从头到尾打印链表 输入一个链表&#xff0c;按链表值从尾到头的顺序返回一个ArrayList。 # -*- coding:utf-8 -*- class ListNode:def __init__(self, x):self.val xself.next Noneclass Solution:def printListFromTailToHead(self, listNode):l []while listNode:l.appe…

spring学习(44):p名称空间注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

A*算法

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 Dijkstra不能解决的问题 在Dijkstra类似BFS&#xff0c;从起始节点找到距离最短的节点&#xff0c;一层一层向外扩展&#xff0c;直到找到目标节点。 在有些时候这种…

导入安全证书到jdk

一&#xff1a;.导入证书 1.打开doc窗口&#xff0c;打开cmd&#xff0c;执行命令&#xff1a; keytool -import -file f:\ca.crt -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -alias server-file 指定证书文件的位置 -alias 指定证书的别名 2.输入密钥库口令…

spring学习(45):util名称空间注入

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

拓扑排序两种实现方式

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 拓扑排序能解决的问题 在一个项目中会有很多源代码文件。编译器在编译代码的时候需要按照依赖关系&#xff0c;依次编译每个源文件。例如A.java依赖B.java&#xff…

Jmeter_http request的简单设置和应用

http request 协议、地址、端口号 参数类型 正则搜索 帮助文档 相等的关系 匹配正则的结果&#xff08;jmeter一般都用分组取想用的数据&#xff09; 转载于:https://www.cnblogs.com/rychh/articles/11087537.html

spring学习(46):spring的单例bean

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

943. Find the Shortest Superstring

目录题目描述暴力搜索分析暴力搜索优化动态规划参考链接题目描述 输入&#xff1a;字符串数组String[] A 输出&#xff1a;一个字符串result&#xff0c;A中每一个字符串是result的子串&#xff0c;并且reuslt是符合这个条件的最短的字符串。 举例&#xff1a; 输入: [“alex”…

install-info - 更新 info/dir 项

SYNOPSIS 总览 install-info [OPTION]... [INFO-FILE [DIR-FILE]] DESCRIPTION 描述 从 Info 目录文件 DIR-FILE 中的文件 INFO-FILE 中安装或删除 dir 目录项。 OPTIONS 选项 --delete删除 DIR-FILE 中的 INFO-FILE 里已有的项&#xff1b;不插入任何新项。--dir-fileNAME指定…

spring学习(47):bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

visual studio 2017 显示行号

1.Tools中选择Options...&#xff0c; Options界面中Test Editor -> All Languages&#xff08;当然也可以设置对应的语言&#xff09; -> General&#xff0c; 在Settings中勾选 Line numbers。 2.行号就显示出来了&#xff0c;便于我们去定位代码。 转载于:https://www…

spring学习(48):自动装配中定义的bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

212. Word Search II:多个单词查找

写在前面&#xff1a;这两周持续看花花酱整理的题目列表和视频讲解&#xff0c;也得益于自己持续多年刷题&#xff0c;今天刷这道题目的想法是&#xff1a;会trie树居然就能攻克hard题目&#xff01;我也离独立攻破hard题目不远了嘛。前段时间看王争在极客时间的系列课程&#…

CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构区别...

神经网络技术起源于上世纪五、六十年代&#xff0c;当时叫感知机&#xff08;perceptron&#xff09;&#xff0c;拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层&#xff0c;在输出层得到分类结果。早期感知机的推动者是Rosenblatt。&#xff08;扯…

在mybatis中调oracle dblink存储过程

写在前面&#xff1a;在mybatis中操作oracle的数据&#xff0c;不复杂&#xff0c;也不困难。只是第一次用&#xff0c;入了很多坑&#xff0c;记录一下。在此之前需要一些简单的配置&#xff0c;此前一篇博客已经做了简单叙述&#xff1a; https://www.cnblogs.com/studentc/p…

spring学习(49):javaconfig里面定义bean的作用域

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

675. Cut Off Trees for Golf Event

这道题目最大的难点是理解题意。 文章目录题目理解题目理解 输入&#xff1a;一个非负的二维数组 输出&#xff1a;一个最短距离 规则&#xff1a;数组中的元素如果是0&#xff0c;表示障碍&#xff0c;不能通过。如果是1&#xff0c;表示可以行走的地面。如果大于1表示树的高…

spring学习(50):延迟加载

目录结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

ansible的错误

错误 [rootbogon ansible]# ansible test -m ping 192.168.16.155 | FAILED! > { "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this hosts finger…