问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何用 SQL 实现 Dijkstra 的最短路径算法

发布网友 发布时间:2022-04-22 16:44

我来回答

2个回答

懂视网 时间:2022-04-30 09:14

我本来不想做这么蛋疼的事情的,可是更蛋疼的是我看了王大神的博客然后中毒了!我发誓再!不!看!了!
不过问题本身还是有一点意思的,正好学过图论没有实现过dijkstra,刚好在慕课上又学了一点pl/sql。然后就这样一个题目做了一晚上然后还是不想睡觉,赶紧写点代码来压压惊。
 技术分享
图片出自http://blog.jobbole.com/70639/ 《真正统治世界的十大算法》
顶点可以忽略,对于有权有向边,一般必须的属性:起点、终点、距离,最后表建出来就是这样
技术分享
create table EDGE (   SOURCE      VARCHAR2(10) not null,   DESTINATION VARCHAR2(10) not null,   DISTANCE    NUMBER(4) ) 
对于dijkstra算法来说是计算结果是从源点到其他顶点的最短距离以及最短路径,这个好像没办法用变量保存 
所以再建立一张全局临时表保存计算结果
create global temporary table DISTANCE (   DESTINATION VARCHAR2(10),--目的点   DISTANCE    NUMBER(4),--最短路径   PREVIOUS    VARCHAR2(10),--经过的上一个节点   SOURCED     VARCHAR2(1)--是否当过源点 ) on commit delete rows;

-- Created on 2015/7/21 by cbwleft  declare    -- Local variables here   va_source edge.source%type:=‘s‘;   va_distance Integer:=0; begin   -- Test statements here   insert into distance(destination,distance,previous) values(va_source,0,va_source);--源点到自己的距离为0   loop     for edge in (select * from edge where source=va_source)--查询邻接边     loop       merge into distance t using dual on (t.destination  = edge.destination)         when matched then update set distance = edge.distance+va_distance where distance>edge.distance+va_distance--更新距离         when not matched then insert  values (edge.destination,edge.distance+va_distance,va_source,‘0‘);--加入邻接点     end loop;     select max(destination),max(distance) into va_source,va_distance from         (select * from distance t where sourced =‘0‘ order by distance) where rownum=1;--贪心     exit when va_source is null;     update distance set sourced=‘1‘ where destination=va_source;   end loop; end; 

最后在事务提交前执行查询,路径好像最后还得用递归统计一次。
技术分享 
 好吧脑壳晕了,明天再检查正确性。

 

好吧,使用sql实现Dijkstra算法

标签:

热心网友 时间:2022-04-30 06:22

您好.

开个表当dijkstra里面那个【我从哪里来】数组,剩下的用T-SQL都一样,分支循环样样能写

我不知道为什么用关系数据库的sql来搞图模型的算法~先考虑数据怎么存吧。

如果用图数据库neo4j的类sql的cypher,分分钟搞定啊

如果还有问题,可以继续追问,感谢。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
山东沃尔德集团集团所辖公司介绍 齐鲁银行无忧贷和市民贷哪个好 什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 梦见自已嘴里长肉包 为什么要用NoSQL数据库管理系统 nosql数据库的几大类型 Graphscope、Neo4j有人用过吗?感受如何? 梦见自己长了四颗牙齿 梦见舌头长芽 想问一下图数据库neo4j和spark下面的graphx有什么区别 为什么选择图形数据库,为什么选择neo4j 梦见四个月的儿子舌头上长了一颗牙齿,是什么 周公解梦梦见自己 梦到自己舌头上长了四颗牙齿意味着什么 dcdc带负载能力看芯片的哪一项参数 DCDC降压芯片的输入端的滤波电容发烫? DCDC降压芯片的软起动时间是什么意思 晋江市各镇的人数姓氏分布! 96V直流输入如何变成72V直流输出?求电路图。 MOS管和DCDC升压转换器的主要参数是···? python的pymol专家 链接时出现一个undefined reference to 问题,实在不懂为什么 visual stdio2008 安装qt库 spark graphx 可以求两点之间所有通路吗 鏈夐┈娑﹀湪灏辫屼簡锛屾垜浠鍦ㄤ笉鍦ㄦ剰涔変笉澶是什么字 梦见做梦舌头舔松动的牙齿?意外什么吗? 梦见掉牙那种说法比较正确 火狐登陆邮箱,提示安全连接失败,(错误码: ssl_error_no_cypher_overlap) 小螺丝十字凹槽磨圆了拧不开 健康管理师考试会被取消吗? 健康管理师考试改革新规定发生哪些新变化? 健康管理师明年要改政策了么? 2020年健康管理师还能考试吗? 健康管理师退出目录是否意味着考试取消? 官方消息:2020年健康管理师考试相关说明 404 Not Found 2020年健康管理师第一次考试延期大概多久 会取消吗? 2020健康管理师考试政策有改动吗? 2020年健康管理师报考常见热点问题 打蜡可不可以去掉汽车的刮痕 汽车打蜡可以去除划痕吗? 汽车打蜡真的能去掉细小划痕吗?