SQLServer实现最短路径的搜索算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

131****3377 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档