t-sql最短路径搜索
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
GO
IF OBJECT_ID(N'dbo.t1') IS NOT NULL
DROP TABLE dbo.t1;
GO
CREATE TABLE t1
(
id INT IDENTITY(1, 1)
PRIMARY KEY ,
a NVARCHAR(2) ,
b NVARCHAR(2)
);
--建立索引a
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190507-201219] ON [dbo].[t1]
(
[a] ASC
)
INCLUDE ( [b]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
GO
--建立索引b
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20190507-201235] ON [dbo].[t1]
(
[b] ASC
)
INCLUDE ( [a]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY];
GO WITH cte_0 ( a, b )
AS ( SELECT 1 ,
2
UNION ALL
SELECT 1 ,
3
UNION ALL
SELECT 2 ,
4
UNION ALL
SELECT 2 ,
5
UNION ALL
SELECT 2 ,
3
UNION ALL
SELECT 3 ,
6
UNION ALL
SELECT 4 ,
9
UNION ALL
SELECT 5 ,
7
UNION ALL
SELECT 6 ,
9
UNION ALL
SELECT 7 ,
8
UNION ALL
SELECT 8 ,
10
UNION ALL
SELECT 9 ,
10
UNION ALL
SELECT 9 ,
12
UNION ALL
SELECT 10 ,
11
UNION ALL
SELECT 11 ,
12
)
INSERT INTO t1
( a ,
b
)
SELECT a ,
b
FROM cte_0
UNION ALL
SELECT b ,
a
FROM cte_0;
--加上是否循环的标记(效率较不加循环标记要高)
WITH cte_a
AS ( SELECT a ,
b
FROM dbo.t1
--UNION ALL
--SELECT b ,
-- a
--FROM dbo.t1
),
cte_b
AS ( SELECT a ,
b ,
0 AS isok ,
CAST(a + '>' + b AS NVARCHAR(MAX)) AS c_path ,
1 AS nlevel
FROM cte_a
WHERE a = ''--起点
UNION ALL
SELECT s.a ,
s.b ,
CASE WHEN s.b = '' THEN 1--如果下一层找到了终点,那么不需要继续向下找
ELSE 0
END AS isok ,
CAST(p.c_path + '>' + s.b AS NVARCHAR(MAX)) AS c_path ,
p.nlevel + 1
FROM cte_a AS s
INNER JOIN cte_b AS p ON p.b = s.a
WHERE CHARINDEX(s.b, p.c_path) = 0
AND p.isok = 0
),
cte_c
AS ( SELECT *
FROM cte_b
--WHERE b = '11'--终点
)
SELECT *
FROM cte_c
--WHERE cte_c.nlevel = ( SELECT MIN(cte_c.nlevel)
-- FROM cte_c
-- );
像个乞丐
t-sql最短路径搜索的更多相关文章
- 使用pgrouting进行最短路径搜索
PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法 ...
- Java室内最短路径搜索(支持多楼层)
修改了上次的代码,现在支持室内的多楼层情况下的最短路径搜索,还是使用A*算法,把在GraphAdjList中VNode没有利用起来的data字段作为我们存储楼层属性的位置. 实际上是我偷懒了,正常情况 ...
- Python 图_系列之基于<链接表>实现无向图最短路径搜索
图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...
- A*算法的原理 <转>
第一部分:A*算法简介 写这篇文章的初衷是应一个网友的要求,当然我也发现现在有关人工智能的中文站点实在太少,我在这里 抛砖引玉,希望大家都来热心的参与. 还是说正题,我先拿A*算法开刀, ...
- A*算法详解 BZOJ 1085骑士精神
转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...
- 深入了解A*
一.前言 在这里我将对A*算法的实际应用进行一定的探讨,并且举一个有关A*算法在最短路径搜索的例子.值得注意的是这里并不对A*的基本的概念作介绍,如果你还对A*算法不清楚的话,请看姊妹篇<初识A ...
- 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- PAT 1003
1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...
随机推荐
- Subarray Sorting (线段树)
题意:给你两个长度为 n 的序列 a 和 b , 可以对 a 进行 操作: 选择一段区间[ l, r ] ,使得序列a 在这段区间里 按升序排序. 可以对a 进行任意多次操作,问 a是否有可能变成b序 ...
- MessagePack Java Jackson Dataformat 在 Map 中不使用 String 为 Key 的序列化
当你希望在 Map 中不使用 String 为 Key,那么你需要使用 MessagePackKeySerializer 来为 key 进行序列化. 本测试方法,可以在 https://github. ...
- [HNOI2004][bzoj1211] 树的计数(prufer序列)
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3432 Solved: 1295[Submit][Stat ...
- css引入第三方字体
上面图片时将字体文件放入到fonts文件夹内, 里面有一个fonts.css文件,将字体文件声明好, 然后像下面图片一样,在另外一个css内@import引入,(当然,也可以直接将声明和引用放在一个c ...
- MySQL基础入门之常用命令使用
如何启动MySql服务 /etc/init.d/mysqld start service mysqld start Centos .x 系统 sysctl start mysqld 检测端口是否运行 ...
- [JOI2012春季合宿]Constellation (凸包)
题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...
- 大体知道java语法2----------理解面向对象
我参加过大大小小n场面试,被好几位面试官问到过:能不能谈谈面向对象的几大特征?什么是面向对象?对于这两个问题,我始终觉得一定要理解,其实不只是这种概念题(姑且算它是概念题吧),包括各种语法都应该去理解 ...
- 对iOS锁的一些研究
#import <objc/runtime.h> #import <objc/message.h> #import <libkern/OSAtomic.h> #im ...
- rabbitmq访问控制试坑篇
访问控制我理解就是两层,第一层是Virtual host,相当于一个个独立主机 第二层是这个permissions,对照下图权限表 权限表(重要!) 需求 configgure write read ...
- java获取来访者mac信息
根据IP获取对应的Mac地址,支持win10+Linux package com.simonjia.util.other; /** * @Author: SimonHu * @Date: 2019/6 ...
