当前位置: 首页 > 编程日记 > 正文

经典算法研究系列:二、Dijkstra 算法初探

经典算法研究系列:二、Dijkstra 算法初探

 July   二零一一年一月

======================

本文主要参考:算法导论 第二版、维基百科。

写的不好之处,还望见谅。
本经典算法研究系列文章,永久勘误,永久更新、永久维护。
   July、二零一一年二月十日更新。

------------------------------------

一、A*搜索算法

三、dynamic programming

二、Dijkstra 算法

五(续)、教你透彻了解红黑树

五、红黑树算法的实现与剖析

六、教你从头到尾彻底理解KMP算法

四、BFS和DFS优先搜索算法

--------------------------------------

一、Dijkstra 算法的介绍

Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),
算法解决的是有向图中单个源点到其他顶点的最短路径问题。
举例来说,
如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离,
Dijkstra 算法可以用来找到两个城市之间的最短路径。

二、Dijkstra 的算法实现

Dijkstra 算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。
我们以 V 表示 G 中所有顶点的集合,以 E 表示G 中所有边的集合。
(u, v) 表示从顶点 u 到 v 有路径相连,而边的权重则由权重函数 w: E → [0, ∞] 定义。

因此,w(u, v) 就是从顶点 u 到顶点 v 的非负花费值(cost),边的花费可以想像成两个顶点之间的距离。
任两点间路径的花费值,就是该路径上所有边的花费值总和。

已知有 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t 的最低花费路径(例如,最短路径)。
这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。

好,咱们来看下此算法的具体实现:

Dijkstra 算法的实现一(维基百科):

u := Extract_Min(Q) 在顶点集合 Q 中搜索有最小的 d[u] 值的顶点 u。这个顶点被从集合 Q 中删除并返回给用户。

 1  function Dijkstra(G, w, s)
 2     for each vertex v in V[G]                        // 初始化
 3           d[v] := infinity
 4           previous[v] := undefined
 5     d[s] := 0
 6     S := empty set
 7     Q := set of all vertices
 8     while Q is not an empty set                      // Dijkstra演算法主體
 9           u := Extract_Min(Q)
10           S := S union {u}
11           for each edge (u,v) outgoing from u
12                  if d[v] > d[u] + w(u,v)             // 拓展边(u,v)
13                        d[v] := d[u] + w(u,v)
14                        previous[v] := u

如果我们只对在 st 之间寻找一条最短路径的话,我们可以在第9行添加条件如果满足 u = t 的话终止程序。
现在我们可以通过迭代来回溯出 st 的最短路径

1 s := empty sequence
2 u := t
3 while defined u                                       
4       insert u to the beginning of S
5       u := previous[u]
现在序列 S 就是从 st 的最短路径的顶点集.

Dijkstra 算法的实现二(算法导论):

DIJKSTRA(G, w, s)
1  INITIALIZE-SINGLE-SOURCE(G, s)
S Ø
Q V[G]                                 //V*O(1)
while Q Ø
5      do u EXTRACT-MIN(Q)     //EXTRACT-MIN,V*O(V),V*O(lgV)
6         S S {u}
7         for each vertex v Adj[u]
8             do RELAX(u, v, w)       //松弛技术,E*O(1),E*O(lgV)。

因为Dijkstra算法总是在V-S中选择“最轻”或“最近”的顶点插入到集合S中,所以我们说它使用了贪心策略。

(贪心算法会在日后的博文中详细阐述)。

===========================================

二零一一年二月九日更新:
此Dijkstra 算法的最初的时间复杂度为O(V*V+E),源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)
当是稀疏图的情况时,E=V*V/lgV,算法的时间复杂度可为O(V^2)。

但我们知道,若是斐波那契堆实现优先队列的话,算法时间复杂度,则为O(V*lgV + E)。

三、Dijkstra 算法的执行速度

我们可以用大O符号将Dijkstra 算法的运行时间表示为边数 m 和顶点数 n 的函数。Dijkstra 算法最简单的实现方法是用一个链表或者数组来存储所有顶点的集合 Q,
所以搜索 Q 中最小元素的运算(Extract-Min(Q))只需要线性搜索 Q 中的所有元素。
这样的话算法的运行时间是 O(E^2)。

对于边数少于 E^2 的稀疏图来说,我们可以用邻接表来更有效的实现迪科斯彻算法。
同时需要将一个二叉堆或者斐波纳契堆用作优先队列来寻找最小的顶点(Extract-Min)。

当用到二叉堆时候,算法所需的时间为O(( V+E )logE),
斐波纳契堆能稍微提高一些性能,让算法运行时间达到O(V+ElogE)。(此处一月十六日修正。)


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

与最短路径问题相关最有名的一个问题是旅行商问题(Traveling salesman problem),此类问题要求找出恰好通过所有标点一次且最终回到原点的最短路径。
然而该问题为NP-完全的;换言之,与最短路径问题不同,旅行商问题不太可能具有多项式时间解法。
如果有已知信息可用来估计某一点到目标点的距离,则可改用A*搜寻算法,以减小最短路径的搜索范围。

=========================================

二零一一年二月九日更新
BFS、DFS、Kruskal、Prim、Dijkstra算法时间复杂度的比较:
一般说来,我们知道,BFS,DFS算法的时间复杂度为O(V+E),
最小生成树算法Kruskal、Prim算法的时间复杂度为O(E*lgV)。

而Prim算法若采用斐波那契堆实现的话,算法时间复杂度为O(E+V*lgV),当|V|<<|E|时,E+V*lgV是一个较大的改进。
//|V|<<|E|,=>O(E+V*lgV) << O(E*lgV),对吧。:D

Dijkstra 算法,斐波纳契堆用作优先队列时,算法时间复杂度为O(V*lgV + E)。
//看到了吧,与Prim算法采用斐波那契堆实现时,的算法时间复杂度是一样的。

所以我们,说,BFS、Prime、Dijkstra 算法是有相似之处的,单从各算法的时间复杂度比较看,就可窥之一二。

四、图文解析 Dijkstra 算法

ok,经过上文有点繁杂的信息,你还并不对此算法了如指掌,清晰透彻。
没关系,咱们来幅图,就好了。请允许我再对此算法的概念阐述下,

Dijkstra算法是典型最短路径算法,用于计算一个节点到其他所有节点的最短路径。
不过,针对的是非负值权边。

主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
[Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。]

ok,请看下图:

如下图,设A为源点,求A到其他各所有一一顶点(B、C、D、E、F)的最短路径。线上所标注为相邻线段之间的距离,即权值。

(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一一对等)

               Dijkstra无向图

算法执行步骤如下表

是不是对此Dijkstra 算法有不错的了解了。那么,此文也完了。:D。

              ----July、2010年12月24日。平安夜。

==============================================

此文,写的实在不怎么样。不过,承蒙大家厚爱,此经典算法研究系列的后续文章,个人觉得写的还行。
所以,还请,各位可关注此算法系列的后续文章。谢谢。

                 二零一一年一月四日。

转载于:https://www.cnblogs.com/v-July-v/archive/2010/12/24/1983708.html

相关文章:

[Python Study Notes] Python的安装

Windows&#xff1a; 1.下载安装包&#xff1a; 转到Python官网https://www.python.org/downloads/ &#xff0c;下载最新版本的Python。 2.安装 安装到自定义的安装路径下。 3.配置环境变量 安装完成后--》【右键快捷方式】--》【复制python路径】&#xff0c;例如&#xff1…

swing 实现电影选座系统

该系统使用swing数据库 实现一个电影选座系统&#xff0c;相关系统的截图如下 使用三层架构实现电影购票系统&#xff0c;分用户和管理员&#xff0c;用户功能:展示电影&#xff0c;查找电影(模糊查询)&#xff0c;查看电影详情&#xff0c;查找场次&#xff0c;购买影票&…

JS动态加载JS

1、直接document.write <script language"javascript"> document.write("<script srctest.js><\/script>"); </script> 2、动态改变已有script的src属性 <script src id"s1"></script> <script lang…

PAT乙级1037

1037 在霍格沃茨找零钱 (20 分)如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利…

SAD和SATD的区别[摘]

Q:如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估计中&#xff0c;整象素搜索用SAD&#xff0c;而亚象素用SATD&#xff1f;为什么帧内模式选择要用SATD&#xff1f…

照片换色 使用Python 或者 java

记录使用第三方api 给照片换底色&#xff0c;智能抠图。 1、第三方接口地址 https://www.remove.bg/api 2、抠图效果 3、使用python 实现的代码 在网页换色是不需要进行注册的&#xff0c;如果自己开发 需要注册账号 &#xff0c;得到调取api的口令 import requests impor…

WEB安全,SQL注入漏洞的加固代码汇总

该修复任务专用于处理以下安全性问题&#xff1a;[1] SQL 盲注[2] SQL 注入[3] XPath 注入[4] 发现数据库错误模式[5] 跨站点脚本编制[6] 使用 SQL 注入的认证旁路[7] HTTP 响应分割[8] 链接注入&#xff08;便于跨站请求伪造&#xff09;详细信息若干问题的补救方法在于对用户…

mui ios中form表单中点击输入框头部导航栏被推起及ios中form表单中同时存在日期选择及输入框时,日历选择页面错乱bug...

一、ios header导航栏被推起解决方法 1 设置弹出软键盘时自动改变webview的高度 plus.webview.currentWebview().setStyle({ softinputMode: "adjustResize" // 弹出软键盘时自动改变webview的高度 }); 2 增加样式 html, body { height: 100%; margin: 0px; …

qt试用1(Eclipse+cdt+Qt)

下载eclipse-cpp-helios-SR1-win32.zip下载Qt下载qt-eclipse-integration-win32-1.6.1.exe写一个启动eclipse的batch文件C:\program\eclipse-cpp-helios-SR1-win32\eclipse\cdt.batset path%path%;C:\Qt\2010.05\mingw\binset LIBRARY_PATHC:\Qt\2010.05\mingw\libset C_INCLUD…

Solr 中遇到的问题

1、问题1 &#xff1a;whose UTF8 encoding is longer than the max length 32766 Error from server at http://localhost:8983/solr/newcore: Exception writing document id 995 to the index; possible analysis error: Document contains at least one immense term in f…

【推荐】Flex+asp.net上传文件

前台Flex文件&#xff1a;UploadSample.mxml&#xff0c;其代码如下所示&#xff1a; 1 <?xml version"1.0" encoding"utf-8"?>2 <mx:Application xmlns:mx"http://www.adobe.com/2006/mxml"layout"absolute">3 <mx:…

Centos查找命令清单

查找目录&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键字 -type d查找文件&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键字 -print 如果需要更进一步的了解&#xff0c;可以参看Linux的命令详解。 这里摘抄如下&#xff1a; find …

docker 安装使用 solr

目录 1、安装solr 7.5 2、启动solr服务 2.1 创建一个solr库 3、配置IK分词器 4、docker 配置solr登录密码 1、安装solr 7.5 docker solr 官网&#xff1a;https://hub.docker.com/_/solr/ docker pull solr:7.5.0 2、启动solr服务 docker run --name my_solr -d -p 898…

2010中国城市GDP排名

1、上海市 14900.93亿元 8.2&#xff05; 上海 2、北京市 11865.9亿元 10.1% 北京 3、广州市 9118.6亿元 11% 广东1 4、深圳市 8245亿元 10.5% 广东2 5、天津市 7500亿元 16.5% 天津 6、苏州市 7400亿元 11% 江苏1 7、重庆市 5856亿元 14.9% 重庆 8、杭州市 5098.66亿元 10% 浙…

基于wsimport生成代码的客户端

概述 wsimport是jdk自带的命令&#xff0c;可以根据wsdl文档生成客户端中间代码&#xff0c;基于生成的代码编写客户端&#xff0c;可以省很多麻烦。wsimport命令 wsimport的用法 wsimport [options] <WSDL_URI>比较常用的[options]有&#xff1a;1. -d <directory>…

C# Trim 的使用

C# 移除字符 /// <summary> /// 删除指定字符 /// </summary> /// <returns>返回经过修饰的字符串</returns> private string DelChar() { string mess " Test Program "; // 测试字符 if (mess ! string.Empty) …

CSS截取字符串,兼容浏览器

今天在经典论坛看到有同学问到CSS截取字符多余省略号代替的求助且要兼容FF... 这个的确是个比较头痛的问题&#xff0c;现在我在的公司都是程序截取显示省略符的。兼容是没问题&#xff0c;但在中文和数学或字母混排时&#xff0c;就会有点小小的视觉缺陷。在程序截取中&#x…

SQL Server Alwayson 主从数据库账号同步

我们建立了Alwayson后&#xff0c;辅助副本下的数据库是没有相应的账号的&#xff0c;怎么样进行账号的同步呢&#xff1f;怎么在不知道密码的情况下&#xff0c;进行账号的同步设置。 我们可以通过SP--sp_help_revlogin 来实现&#xff0c;此存储过程在主副本上创建了&#xf…

Python 使用 Flask框架记录

Python 使用 Flask框架记录 1、安装Flask ​ Flask依赖两个外部库&#xff0c;Werkzeug和Jinja2&#xff0c;Werkzeug是一个WSGI(服务器网关接口)。Jinja2时负责渲染模板。在安装Flask之前需要安装这俩个外部库&#xff0c;最简单的安装方式是使用Vritualenv创建虚拟环境。 …

java8学习之Lambda表达式深入与流初步

Lambda表达式深入&#xff1a; 在上一次【http://www.cnblogs.com/webor2006/p/8135873.html】中介绍Lambda表达式的作用时&#xff0c;其中说到这点&#xff1a; 如标红处所说&#xff0c;既然Lambda表达式是一个对象&#xff0c;而且必须依附于一类特别的对象类型叫函数式接口…

Javascript与正则表达式个人总结与收录--高级篇

一、正则表达式中的量词 贪婪量词&#xff1a; 先看整个字符串是不是一个匹配。如果没有发现匹配&#xff0c;它去掉最后字符串中的最后一个字符&#xff0c;并再次尝试。如果还是没有发现匹配&#xff0c;那么再次去掉最后一个字符串&#xff0c;这个过程会一直重复直到发现一…

第二十五章 面向对象------封装、内置函数、反射、动态导入

1、封装 什么是封装&#xff1f; 1.对外部隐藏内部的属性&#xff0c;以及实现细节&#xff0c;给外部提供使用的接口 注意&#xff1a;封装有隐藏的意思&#xff0c;但不是单纯的隐藏 学习封装的目的&#xff1a;就是为了能够限制外界对内部数据的访问 python中属性的权限分为…

STL vector list deque区别与实现

1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时&#xff0c;首先分配一个非常大的内存空间预备进行存储&#xff0c;即capacituy&#xff08;&#xff09;函数返回的大小&#xff0c;当超过此分配的空间…

pigeon 介绍

https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架&#xff08;RPC&#xff09;&#xff0c;在美团点评内部广泛使用&#xff0c;是美团点评最基础的底层框架之一。 主要特色 除了支持spring schema等配置方式&#xff0c;也支持代码annotati…

docker 安装使用 mysql

1、下载mysql镜像 docker pull mysql:5.7 2、运行mysql docker run --name my_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDXYBB_1314 -d mysql:5.7 参考&#xff1a; https://blog.csdn.net/jiangyu1013/article/details/79958410 https://www.cnblogs.com/limingxie/p/…

国内第一部IT治理综合图书问世

国内第一部全面阐述企业IT治理理念与实践的图书《中国企业的IT治理之道》于2010年3月由清华大学出版社正式出版发行。对国内的企业来说&#xff0c;IT治理并不是一个陌生的词汇。对于什么是IT治理&#xff1f;什么样的治理才是最优的&#xff1f;如何构建最适合企业的IT治理机构…

oracle终止用户会话

1.创建两个测试用户进行实验 执行命令如下&#xff1a; create user test1 identified by 1; create user test2 identified by 1; grant dba to test1; grant dba to test2; 如下图&#xff0c;我创建了两个用户,并授予两个用户dba角色。 2&#xff0c;windows下使用cmd连接or…

正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码......

当我在窗体初始化的时候&#xff0c;调用了一个外部的dill时&#xff0c;它就不知什么原因的 抛出一个“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”的异常,程序就卡掉了,在网上查了查&#xff0c;相关说明如下:.NET2.0中增加…

Nginx在windows下常用命令

cmd 进入Nginx解压目录 执行以下命令 start nginx : 启动nginx服务 nginx -s reload &#xff1a;修改配置后重新加载生效 nginx -s reopen &#xff1a;重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确--------------------- 验证配置是否正确: n…

微信小程序使用npm 进行下载构建组价

1、进入小程序根目录 构建前微信小程序目录 使用npm 初始化命令进行初始化小程序目录 npm init -y 构建后的目录为 构建完成后 如何进行使用 {"usingComponents": {"van-notice-bar": "/miniprogram_npm/vant-weapp/notice-bar/index"} }如果提…