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 ...
随机推荐
- AtCoder AGC038D Unique Path (图论)
题目链接 https://atcoder.jp/contests/agc038/tasks/agc038_d 题解 orz zjr神仙做法 考虑把所有\(C_i=0\)的提示的两点连边,那么连完之后的 ...
- Latex里的引用定理只出现编号,不出现定理名?
在前面先定义了: \newtheorem{prb}{Problem Formulation} 然后: \begin{prb} \label{problem} xx\end{prb}效果: Proble ...
- P1914 小书童——密码
输入格式: 第一行:n.第二行:未移动前的一串字母 输出格式: 一行,是此蒟蒻的密码 直接上代码: #include<iostream> using namespace std; int ...
- LightGBM GPU python版本安装
失败的安装尝试 1.官方Guide https://lightgbm.readthedocs.io/en/latest/GPU-Windows.html 生成在windows下可执行的exe程序,但是 ...
- uni-app 尺寸单位
uni-app 支持的通用 css 单位包括 px.rpx px 即屏幕像素 rpx 即响应式px,一种根据屏幕宽度自适应的动态单位.以750宽的屏幕为基准,750rpx恰好为屏幕宽度.屏幕变宽,rp ...
- Spring核心内容-认识bean
- Android OkHttp3简介和使用详解
一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...
- modprobe 和 insmod 区别
1 关于内核加载方式 1) insmod : insmod一次只能加载特定的一个设备驱动,且需要驱动的具体地址 举例说明: insmod pblk.ko // 需要制定pbl ...
- JDBC事务案例学习
package com.loaderman.demo.d_tx; import com.loaderman.demo.utils.JdbcUtil; import java.sql.Connectio ...
- JavaScript简易事件触发合集
1.<input id="billing" type="text" placeholder="123" onkeyup="t ...