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 ...
随机推荐
- matplotlib(二):折线图
import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates # 解决中文显示问题 plt. ...
- DelayQueue实现延迟队列
public class Q { public static void main(String[] args) throws Exception { DelayQueue<Order> o ...
- [题解] [AtCoder2134] Zigzag MST
题面 题解 考虑kruscal的过程 对于三个点\(x, y, x + 1\), 我们可以将\((x, y, z), (y, x + 1, z + 1)\)看做\((x, y, z), (x, x + ...
- flask 第四篇 模板语言jinja2
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- orale数据库的SQL查询
创建学生表,成绩表,教师表,课程表,分别添加数据信息 create table student( sno ) primary key, sname ), sage ), ssex ) ); cre ...
- python3笔记二十三:正则表达式之元字符
一:学习内容 匹配单个字符与数字:..[].^.\d.\D.\w.\W.\s.\S 匹配锚字符(边界字符):^.$.\A.\Z.\b.\B 匹配多个字符:(xyz) .x?.x*..*.x+.x{n} ...
- ELK- elasticsearch 讲解,安装,插件head,bigdesk ,kopf,cerebro(kopf升级版)安装
ElasticSearch:简称es ,分布式全文搜索引擎,使用java语言开发,面向文档型数据库,一条数据就是一个文档,数据用json序列化后存储. 默认端口:9200 借助redis来理解 red ...
- wait/notify模拟连接池
连接池中的连接可重复使用,减少每次新建和烧毁连接对资源的消耗,但连接池的容量大小也要设置合理,否则也会占用多余的资源.连接池的基本功能是获取连接和释放连接 连接在java中也是一个类,连接对象是一个普 ...
- python sqlalchemy 进行 mysql 数据库操作
1. 进行mysql数据库的创建,如果已经存在,就相当于进行数据库的连接操作 from sqlalchemy import create_engine from sqlalchemy.ext.decl ...
- vue.js-动态绑定class 利用index实现导航
<template> <div class="stock"> <div class="buin_leftcont nav_ctrl" ...
