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

前端技术 2023/09/04 MSSQL

开始

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

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

图1.

解析:

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

图2.

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

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

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

第1方法是,

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


图3.

第2方法是,

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

图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

本文地址:https://www.stayed.cn/item/10584

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。