位置: 编程技术 - 正文

在SQL Server中实现最短路径搜索的解决方法(在sql server数据库中)

编辑:rootadmin

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

在表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数据的脚本:编写一个存储过程up_GetPath上面的存储过程,主要分为两大部分,第1部分是实现如何搜索,第2部分实现如何构造返回结果。其中第1部分的代码根据前面的方法2,通过@Node 和 @RelatedNode 两个节点向外层搜索,每次搜索返回的节点都保存至临时表#1和#2,再判断临时表#1和#2有没有出现切点,如果出现就说明已找到最短的路径(经过多节点数最少),否则就继续循环搜索,直到循环至最大的搜索深度(@MaxLevel smallint=)或找到切点。要是到层都没搜索到切点,将放弃搜索。这里使用最大可搜索深度@MaxLevel,目的是控制由于数据量大可能会导致性能差,因为在这里数据量与搜索性能成反比。代码中还说到一个正向和反向搜索,主要是相对Node 和 RelatedNode来说,它们两者互为参照对象,进行向外搜索使用。

下面是存储过程的执行:

你可以根据需要来,赋予@Node 和 @RelatedNode不同的值。拓展:前面的例子,可扩展至城市的公交路线,提供两个站点,搜索经过这两个站点最少站点公交路线;可以扩展至社区的人际关系的搜索,如一个人与另一个人想认识,那么他们直接要经过多少个人才可以。除了人与人直接有直接的朋友、亲戚关联,还可以通过人与物有关联找到人与人关联,如几个作家通过出版一个本,那么就说明这几个人可以通过某一本书的作者列表中找到他们存在共同出版书籍的关联,这为搜索两个人认识路径提供参考。这问题可能会非常大复杂,但可以这样的扩展。小结:这里只是找两个节点的所有路径中,节点数最少的路径,在实际的应用中,可能会碰到比这里更复杂的情况。在其他的环境或场景可能会带有长度,时间,多节点,多作用域等一些信息。无论如何,一般都要参考一些原理,算法来实现。

推荐整理分享在SQL Server中实现最短路径搜索的解决方法(在sql server数据库中),希望有所帮助,仅作参考,欢迎阅读内容。

在SQL Server中实现最短路径搜索的解决方法(在sql server数据库中)

文章相关热门搜索词:sqlserver有实例吗,sqlserver有实例吗,sqlserver有实例吗,sql server的实例是什么,在sql server中实现数据完整性,在sql server数据库中,在sql server中实现数据完整性,在sql server数据库中,内容如对您有帮助,希望把文章链接给更多的朋友!

基于SQL Server OS的任务调度机制详解 简介SQLServerOS是在Windows之上,用于服务SQLServer的一个用户级别的操作系统层次。它将操作系统部分的功能从整个SQLServer引擎中抽象出来,单独形成一层

SQLite数据库管理相关命令的使用介绍 1.创建数据库启动命令行,通过输入如下命令打开Shell模式的CLP:sqlite3test.db虽然我们提供了数据库名称,但如果该数据库不存在,SQLite实际上就未创建该

sql存储过程的使用和介绍 sqlserver存储过程语法定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQLServer)。如

标签: 在sql server数据库中

本文链接地址:https://www.jiuchutong.com/biancheng/347522.html 转载请保留说明!

上一篇:SqlServer获取存储过程返回值的实例(sqlserver 获取字符位置)

下一篇:基于SQL Server OS的任务调度机制详解(基于sql server的大数据审计分析应用)

  • 自然人电子税务局
  • 经营租赁的税务编码是什么
  • 简易计税方法的销售额不包括其应纳税额
  • 分支机构设立当年是否需要就地预缴企业所得税?
  • 建筑劳务公司工人工资要申报个税吗
  • 航空电子客票行程单在哪里打印
  • 进料边角料内销作进口报关单时为何要在备注栏备注活期
  • 退货退款分录
  • 交了定金签了合同
  • 垃圾处理的公司有哪些
  • 事业单位之间调动需要多久
  • 广告公司对外捐赠的会计处理怎么做?
  • 其他公司归还货款会计分录
  • 企业食堂买东西怎么入账
  • 律师事务所计提准备金的标准
  • 出租土地使用权计入什么科目
  • 发票开什么明目列福利费
  • 专项发票和普通发票的税点
  • 最近偷税女星都有谁
  • 企业范围内已利用的荒山要交城镇土地使用税吗
  • 制造费用分摊的账务处理怎么做?
  • 公司对项目的资金支持
  • 收到承兑汇票会计分录
  • mac系统屏幕
  • win7为什么这么多人用
  • 母公司给全资子公司担保需要决议吗
  • win10 累积更新
  • 废品损失科目的期末余额在借方表示什么?
  • php7安装教程详解
  • php封装数据库操作
  • 企业清算的会计科目
  • 缴纳住房公积金现金流量项目填什么
  • 营改增后一般纳税人缴纳增值税彩用简易征收3%
  • react中路由有哪些常用组件
  • 一般纳税人收到小规模专票怎么抵扣
  • ChatGPT 中文调教指南。各种场景使用指南。学习怎么让它听你的话
  • typescript .d.ts
  • 支付货款没有收据怎么办
  • 公司处理固定资产汽车的账务处理
  • 基本户不注销会扣钱吗
  • 年终奖怎么计算个税
  • 食堂买菜是什么费用
  • 企业取得投资收益要交税吗
  • mysql的环境配置
  • 小规模增值税纳税人优惠政策
  • 高新补助收入属于不征税收入吗
  • 环评费用如何进项抵扣
  • 企业购买汽车的进项税可以抵扣吗
  • 小规模纳税人个体户经营所得税怎么算
  • 预付账款收到发票
  • 持有待售资产的条件
  • 主营业务成本如何做分录
  • 资本公积其他资本公积用途
  • 仓库周转率是什么意思
  • windows下启动mysql的命令是什么
  • sql查询方法有哪些
  • jucheck.exe
  • ie11安装方法
  • linux中的用户管理主要涉及用户账号文件
  • explorer.exe进程文件
  • 两台mac怎么同步
  • ssh免密登录执行shell
  • win8使用教程和技能
  • 面向对象实例化
  • gridview添加数据
  • 谈谈网页设计中的内容
  • kill某个进程
  • unity射击游戏完整功能代码
  • android studio警告
  • javascript语言基础
  • jQuery bt气泡实现悬停显示及移开隐藏功能的方法
  • 说几条javascript的基本规范
  • android documents
  • 税务总局机关
  • 个人取得抽奖,购车抵用,需要缴纳个人所得税吗
  • 江西税收优惠
  • 北京比较大五金市场在哪
  • 2020年增值税运费税率是多少
  • 核准类和备案类的区别
  • 天津环保网站官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设