- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQLServer实现最短路径的搜索算法
SQLServer实现最短路径的搜索算法
PAGE / NUMPAGES
SQLServer实现最短路径的搜索算法
SQL Server 实现最短路径的搜索算法
在表 RelationGraph 中,有三个字段( ID,Node,RelatedNode 两个字段描述两个节点的连接关系; 现在要求,找出从节点
), 其中
p 至节点
Node 和 RelatedNode
j ,最短路径(即经
过的节点最少)。
这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来。
图 1.
解析
为了能够更好的描述表 RelationGraph 中字段 Node 和 RelatedNode 的关系,我在这里特意使用一个图形
来描述,如图 2.
图 2.
在图 2,可清晰的看出各个节点直接如何相连,也可以清楚的看出节点 p 至节点 j 的的几种可能路径。
从上面可以看出第 2 种可能路径,经过的节点最少。
为了解决开始的问题,我参考了两种方法,
第 1 方法是,
参考单源最短路径算法: Dijkstra( 迪杰斯特拉 ) 算法,主要特点是以起始点为中心向外层层扩展,直到扩
展到终点为止。
图 3.
第 2 方法是,
针对第 1 种方法的改进,就是采用多源点方法,这里就是以节点圆外切点,如图 4. :
p 和节点 j
为中心向外层扩展,直到两
图 4.
实现
在接下来,我就描述在 SQL Server
中,如何实现。当然我这里采用的前面说的第
2 种方法,以
P
和J
为始点像中心外层层扩展。
这里提供有表 RelactionGraph 的 create Insert 数据的脚本:
use TestDB
go
3.
if object_id(
RelactionGraph
) Is not
null drop table RelactionGraph
4.
create table RelactionGraph(ID
int
identity,Item nvarchar(50),Relactio
nItemnvarchar(20),constraint PK_RelactionGraph primary key(ID))
go
create nonclustered index IX_RelactionGraph_Item on RelactionGraph(Ite m)include(RelactionItem)
create nonclustered index IX_RelactionGraph_RelactionItem on Relaction Graph(RelactionItem)include(Item)
go
insert into RelactionGraph (Item, RelactionItem ) values
10.
(
a
,
b
),(
a
, c
),(
a
,
d
),( a , e ),
11.
(
b
,
f
),(
b
, g
),(
b
,
h
),
12.
(
c
,
i
),(
c
, j
),
13.
(
f
,
k
),(
f
, l
),
14.
(
k
,
o
),(
k
, p
),
15.
(
o
,
i
),(
o
, l
)
16.
go
编写一个存储过程 up_GetPath
use TestDB
go
exec dbo.up_GetPath
4.
@Node =
p ,
5.
@RelatedNode =
j
go
上面的存储过程,主要分为两大部分,第 1 部分是实现如何搜索,第 2 部分实现如何构造返回结果。其中
第 1 部分的代码根据前面的方法 2,通过 @Node和 @RelatedNode 两个节点向外层搜索,每次搜索返回的节点都保存至临时表 #1 和#2,再判断临时表 #1 和#2 有没有出现切点,如果出现就说明已找到最短的路径
(经过多节点数最少),否则就继续循环搜索,直到循环至最大的搜索深度( @MaxLevel smallint=100 )
或找到切点。要是到 100 层都没搜索到切点,将放弃搜索。这里使用最大可搜索深度 @MaxLevel,目的是控
制由于数据量大可能会导致性能差,因为在这里数据量与搜索性能成反比。代码中还说到一个正向和反向
搜索,主要是相对 Node 和 RelatedNode 来说,它们两者互为参照对象,进行向外搜索使用。
下面是存储过程的执行:
你可以根据需要来,赋予 @Node和 @RelatedNode 不同的值。
use TestDB
go
--Procedure:
4. if object_id( up_GetP
您可能关注的文档
- Secpath典型配置实例之安全vpn3.40006测试(200603).doc
- SGS中英文版硅胶SGS报告材料.doc
- Simtrade国际贸易实训报告材料.doc
- SIYB创业培训教材练习题参考问题详解.doc
- SKETCHUP建模基本步骤.doc
- SmartS3E系列200万像素星光异形防暴红外半球(2.8mm4.doc
- SMW工法桩测量工程质量保证措施.doc
- SOA应用平台下的新一代基础中间件浅谈(20210924010453).doc
- SOA应用平台下的新一代基础中间件浅谈.doc
- SOA整合系统必须的实施步骤.doc
- 长春市2026届高三质量监测(一)一模历史试卷(含答案)原卷.doc
- 长春市2026届高三(一模)历史试卷(含答案).doc
- 2026届八省联考高考日语试卷试题打印版(第一次).doc
- 2026届八省联考高考历史试卷试题打印版(第一次).doc
- 2026届八省联考高考物理试卷试题及答案详解(精校打印).doc
- 开封市2026届高三年级第一次质量检测(一模)数学试卷(含官方答案)原卷.doc
- 湖南省金太阳市、县级优质高中协作体2026届高三元月联考语文试卷(含答案及解析).doc
- 湖南省金太阳市、县级优质高中协作体2026届高三元月联考物理试卷(含答案及解析).doc
- 湖南省金太阳市、县级优质高中协作体2026届高三元月联考数学试卷(含答案及解析).doc
- 湖南省金太阳市、县级优质高中协作体2026届高三元月联考地理试卷(含答案及解析).doc
原创力文档


文档评论(0)