在SQL Server中实现最短路径搜索的解决方法

开始

这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来。


在表RelationGraph中,有三个字段(ID,Node,RelatedNode),其中Node和RelatedNode两个字段描述两个节点的连接关系;现在要求,找出从节点”p”至节点”j”,最短路径(即经过的节点最少)。


在SQL Server中实现最短路径搜索的解决方法


图1.

解析:

了能够更好的描述表RelationGraph中字段Node和 RelatedNode的关系,我在这里特意使用一个图形来描述,
如图2.


在SQL Server中实现最短路径搜索的解决方法


图2.


在图2,可清晰的看出各个节点直接如何相连,也可以清楚的看出节点”p”至节点”j”的的几种可能路径。


在SQL Server中实现最短路径搜索的解决方法


从上面可以看出第2种可能路径,经过的节点最少。


为了解决开始的问题,我参考了两种方法,


第1方法是,


参考单源最短路径算法:Dijkstra(迪杰斯特拉)算法,主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。


在SQL Server中实现最短路径搜索的解决方法
图3.


第2方法是,


针对第1种方法的改进,就是采用多源点方法,这里就是以节点”p”和节点”j”为中心向外层扩展,直到两圆外切点,如图4. :


在SQL Server中实现最短路径搜索的解决方法


图4.

实现:

在接下来,我就描述在SQL Server中,如何实现。当然我这里采用的前面说的第2种方法,以”P”和”J”为始点像中心外层层扩展。


这里提供有表RelactionGraph的create& Insert数据的脚本:

复制代码 代码如下:

use TestDB    


go


if object_id(‘RelactionGraph’) Is not null drop table RelactionGraph


create table RelactionGraph(ID int identity,Item nvarchar(50),RelactionItem nvarchar(20),constraint PK_RelactionGraph primary key(ID))


go


create nonclustered index IX_RelactionGraph_Item on RelactionGraph(Item) include(RelactionItem)


create nonclustered index IX_RelactionGraph_RelactionItem on RelactionGraph(RelactionItem) include(Item)


go


insert into RelactionGraph (Item, RelactionItem ) values


    (‘a’,’b’),(‘a’,’c’),(‘a’,’d’),(‘a’,’e’),


    (‘b’,’f’),(‘b’,’g’),(‘b’,’h’),


    (‘c’,’i’),(‘c’,’j’),


    (‘f’,’k’),(‘f’,’l’),


    (‘k’,’o’),(‘k’,’p’),


    (‘o’,’i’),(‘o’,’l’)


go

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/database/234475.html

(0)
上一篇 2022年1月23日 21:34
下一篇 2022年1月23日 21:34

相关推荐

发表回复

登录后才能评论