突然想到的一个题,有兴趣的来看看. 如何存储一个有向图/无向图.

三断笛 2011-07-20 02:12:54
论坛上问树型表的问题多了,突然想到,有没有办法在数据库中存储一个图?

定义
  图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。

在数据库中怎样存储一个有向图和无向图?
要能够直观,方便,完整地表示顶点与顶点之间的关系.
要有较小的冗余,较小的空间占用.
要能够快速地查询出顶点与顶点之间的关系,能方便地遍历这个图.

100分.纯属讨论研究.
...全文
275 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
三断笛 2011-09-01
  • 打赏
  • 举报
回复
SQL2005/2008技术内幕 T-SQL查询有专门讲树,图这两种数据结构的存储,查询和维护,非常棒,有空转到博客上来.
--小F-- 2011-07-20
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,name varchar(1),pid int)
insert into [tb]
select 1,'A',0 union all
select 2,'B',1 union all
select 3,'D',1 union all
select 4,'C',2 union all
select 5,'D',2 union all
select 6,'A',4 union all
select 7,'E',5 union all
select 8,'F',5
GO
;with cte
as
(
select *,[path]=cast([name]+'->' as varchar(100)) ,[level] = 1 from tb where pid = 0
union all
select a.*, cast(c.[path]+a.[name]+'->' as varchar(100)),[level]+1 from cte c ,tb a where a.pid = c.id
)
select
*
from cte
where len([path]) > 6 and right([path],3) = left([path],3)
/*
id name pid path level
----------- ---- ----------- -------------- -----
6 A 4 A->B->C->A-> 4

(1 行受影响)
*/

------------------------------------------------------------------------
-- Author : happyflystone
-- Date : 2010-04-06
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
------------------------------------------------------------------------

-- Test Data: ta
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
Go
CREATE TABLE tb([cid] NVARCHAR(1),[pid] NVARCHAR(1))
Go
INSERT INTO tb
SELECT 'A','B' UNION ALL
SELECT 'A','D' UNION ALL
SELECT 'B','C' UNION ALL
SELECT 'B','D' UNION ALL
SELECT 'C','A' UNION ALL
SELECT 'D','E' UNION ALL
SELECT 'D','F'
GO
--Start
;with cte
as
(
select *,[path]=cast([cid]+'->' as varchar(100)) ,[level] = 1
from (select distinct cid,cast('' as nvarchar(1)) as pid from tb union select distinct pid ,'' from tb) b
union all
select a.*,cast(a.[cid]+'->'+c.[path] as varchar(100)),[level]+1
from cte c ,tb a
where a.pid = c.cid and charindex(a.[cid]+'->',c.[path])=0
)
select
[path]+cid+'->'
from cte
where exists(select 2 from tb where cid+'->' = right([path],3) and pid+'->' = left([path],3))-- = left([path],3)


--Result:
/*
--------------
A->B->C->A->
C->A->B->C->
B->C->A->B->

(3 行受影响)

*/
--End




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/06/5456223.aspx
--小F-- 2011-07-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/zjcxc/article/details/2009421
看看老大的乘车路线查询..
aXen 2011-07-20
  • 打赏
  • 举报
回复
使用xml来存储?
liangyong1107 2011-07-20
  • 打赏
  • 举报
回复
CTE递归可实现树形图。。但有向图和无向图没明白什么意思..
快溜 2011-07-20
  • 打赏
  • 举报
回复
无向图也可以用这两张表搞定。查询点的时候,把重复的线过滤掉,或者保存的时候根本就不用保存。
快溜 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xxyj6450 的回复:]
引用 4 楼 ssp2009 的回复:

哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思


无向图就是点与点之间有联系,但是无方向,有向图的点与点之间的连接是有方向的.
[/Quote]有向图我说的两个表就可以搞定了,id1起始点id2终止点。id1指向id2
三断笛 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ssp2009 的回复:]

哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思
[/Quote]

无向图就是点与点之间有联系,但是无方向,有向图的点与点之间的连接是有方向的.
快溜 2011-07-20
  • 打赏
  • 举报
回复
哈哈,这个题有意思,说下我的想法,
有向图:
点表:id,x,y,关系表id1,id2
无向图还没搞明白啥意思
AcHerat 2011-07-20
  • 打赏
  • 举报
回复
这个楼主可以结合数据结构图的一些算法,用SQL中的递归应该也可以实现。
Varchar 2011-07-20
  • 打赏
  • 举报
回复
sfssfsff
cd731107 2011-07-20
  • 打赏
  • 举报
回复
用在并发事务和锁上的?
内容概要:本文复现了发表在顶级期刊上的自主水下航行器(AUV)轨迹跟踪控制方法,提出了一种结合非线性反步法与基于李雅普诺夫的模型预测控制(Lyapunov-MPC)的复合控制策略,旨在实现复杂海洋环境下的高精度轨迹跟踪。研究采用经典的Fossen动力学模型对AUV进行六自由度建模,充分刻画其非线性、强耦合及多源扰动的动态特性。在此基础上,通过反步法逐层构造虚拟控制律,并结合Lyapunov函数确保系统全局渐近稳定性,同时引入MPC优化实际控制输入,有效处理输入饱和、执行器约束等实际问,提升系统动态响应与鲁棒性。整个控制算法在Matlab/Simulink平台完成仿真验证,结果表明该方法在存在外部干扰和模型不确定性的情况下仍具有优异的跟踪性能和稳定性。; 适合人群:具备自动控制理论、非线性系统分析、机器人动力学及海洋工程背景,从事智能水下机器人、自主航行器控制或相关方向研究的高校研究生、科研人员及工程技术人员。; 使用场景及目标:① 深入理解非线性控制方法(如反步法、Lyapunov稳定性理论)在实际工程系统中的设计与应用;② 掌握将模型预测控制与非线性控制相结合的先进复合控制器设计流程;③ 为AUV、无人船、水下作业机器人等复杂动力学系统的轨迹跟踪与自主控制研究提供可复现的算法框架与仿真模型参考。; 阅读建议:此资源以高水平期刊论文复现为核心,不仅包含完整的Matlab/Simulink代码实现,更强调控制理论推导与工程实现之间的衔接。建议学习者结合Fossen建模理论、反步法设计步骤、Lyapunov稳定性判据及MPC优化原理,逐模块分析代码逻辑,并通过调整控制参数、设定不同轨迹与干扰工况进行仿真测试,以深入掌握该复合控制策略的设计思想与调参技巧。
源码链接: https://pan.quark.cn/s/a4b39357ea24 标“便捷调整键盘按键功能或禁用特定按键”指的是一种软件特性,它赋予用户权限去个性化键盘按键操作,或者选择性地关闭某些按键的效用。 在计算机操作过程中,有时我们需要依据特定的使用情境来调整键盘的排列方式,例如,电子游戏玩家或许希望禁用Windows系统键以防止在游戏过程中无意间切换到桌面界面,而软件开发者则可能需要通过定制快捷指令来提升作业效率。 所述的“按键重定向”是一种技术手段,它使得用户能够将键盘上任意一个按键的作用替换为其他按键或者一组组合指令。 这项技术通常借助专门的软件来达成,比如MapKeyboard.exe,它作为一个可执行的程序,能够协助用户方便地进行键盘的配置。 用户可以建立新的按键重定向规则,例如将原本的“P”键设定为“Ctrl+C”,这样在按下“P”键时便等同于执行了复制动作。 “键盘按键布局”是指键盘上所有按键的位置安排及其关联的字符或功能定义。 在常规QWERTY结构的键盘上,每个键都对应着特定的字母、数字、符号或功能,但经过按键重定向,我们可以更改这些预设的安排,让键盘展现出更强的个性化和效能。 “按键”涵盖了不仅限于字母和数字键,还包括功能键(如F1至F12)、控制键(Ctrl、Alt、Shift)、特殊功能键(例如Windows键、Esc键)以及方向控制键等。 这些按键在不同的软件或应用环境中承担着多样化的角色,通过实施自定义重定向,可以优化这些按键的表现,以配合个人偏好或特定场景的需求。 当运用MapKeyboard.exe这类工具时,用户一般需要遵循以下流程:1. 运行软件,并进入按键重定向的操作界面。 2. 确定需要调整的按键,这可以通过点击虚拟键盘图示或直...

22,296

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧