`
linxuexin
  • 浏览: 26256 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

用SQL解决有向图问题

阅读更多

一个常见的高级计算机科学问题可以在“有向图”的范畴之下描述。有向图是由一组向量和边所连接的一组有限的节点。例如,一个节点可以想象为一座“城市”,而每个向量可以想象为两座城市间的一个“航线”。

    有很多算法和论文讲到如何解决每种可能路线的遍历问题以及寻找最短路径或者最小代价路径的问题。这些算法中大部分都是过程化的,或者是使用递归方面来解决的。然而 SQL 的声明性语言使得解决复杂的有向图问题更加容易,而且不需要很多代码。

    让我们以两座城市之间的航线为例子,创建一个表保存一些假想数据:

create table airports
(
    code        char(3) constraint airports_pk primary key,
    description varchar2(200)
);

insert into airports values ('LHR','London Heathrow, UK');
insert into airports values ('JFK','New York-Kennedy, USA');
insert into airports values ('GRU','Sao Paulo, Brazil');

create table fares
(
    depart      char(3),
    arrive      char(3),
    price       number,
    constraint fares_pk primary key (depart,arrive),
    constraint fares_depart_fk foreign key (depart) references airports,
    constraint fares_arrive_fk foreign key (arrive) references airports
);

insert into fares values('LHR','JFK',700);
insert into fares values('JFK','GRU',600);
insert into fares values('LHR','GRU',1500);
insert into fares values('GRU','LHR',1600);

    不能使用CONNECT BY 语法来解决如何从伦敦到圣保罗,因为在图中有数据产生一个环(从圣保罗飞回):

select * from fares connect by prior arrive = depart start with depart = 'LHR';
ERROR:
ORA-01436: CONNECT BY loop in user data

    要解决有向图问题,我们需要创建一个临时表来保存两个节点之间所有可能的路径。我们必须注意不复制已经处理过的路径,而且在这种情况下,我们不想路径走回开始处的同一个地点。我还希望跟踪到达目的地所需航程的数目,以及所走路线的描述。

    临时表使用以下脚本创建:

create global temporary table faretemp
(
    depart      char(3),
    arrive      char(3),
    hops        integer,
    route       varchar2(30),
    price       number,
    constraint faretemp_pk primary key (depart,arrive)
);

    一个简单的视图可以在稍微简化这个例子中使用的代码。视图可以根据 fares 表中的单个航程计算从 faretemp 表中的一个路径到达一下一个航程的数据:

create or replace view nexthop
as
    select src.depart,
           dst.arrive,
           src.hops+1 hops,
           src.route||','||dst.arrive route,
           src.price + dst.price price
      from faretemp src,fares dst
     where src.arrive = dst.depart
       and dst.arrive != src.depart;
/
show errors;

分享到:
评论

相关推荐

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书适合专业数据库开发者、BI开发者、DBA和以SQL Server作为后台数据库的一般应用程序开发者,读者可以通过书中的最佳实践、高级技巧和代码示例来掌握这门复杂的编程语言,以切合实际的方案来解决复杂的实际问题。...

    laravel-dag-manager:Laravel 基于 SQL 的有向无环图 (DAG) 解决方案

    Laravel 基于 SQL 的有向无环图 (DAG) 解决方案 这个包允许你创建、保存和删除有向无环图。 基本用法创建直接边: $ newEdges = dag ()-> createEdge ( $ startVertex , $ endVertex , $ source );// $newEdges ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    5.4.3 用T-SQL解决最长上升子序列的长度问题 5.5 总结 第6章 子查询、表表达式和排名函数 6.1 子查询 6.1.1 独立子查询 6.1.2 相关子查询 6.1.3 行为不当的子查询 6.1.4 不常用的谓词 6.2 表表达式(Table ...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    5.4.3 用T-SQL解决最长上升子序列的长度问题227 5.5 总结229 第6章 子查询、表表达式和排名函数231 6.1 子查询232 6.1.1 独立子查询232 6.1.2 相关子查询235 6.1.3 行为不当的子查询244 6.1.4 不常用的谓词245 6.2 ...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    5.4.3 用T-SQL解决最长上升子序列的长度问题227 5.5 总结229 第6章 子查询、表表达式和排名函数231 6.1 子查询232 6.1.1 独立子查询232 6.1.2 相关子查询235 6.1.3 行为不当的子查询244 6.1.4 不常用的谓词...

    在SQL Server中实现最短路径搜索的解决方法

    开始这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来。 在表RelationGraph中,有三个字段(ID,Node,RelatedNode),其中Node和RelatedNode两个字段描述两个节点的连接关系;现在...

    图书馆信息管理系统-数据库课程设计VB-SQL.docx

    首先对系统进行需求分析,根据系统功能设计E-R模型,再进行逻辑结构设计实现E-R图向关系模型的转换,并优化数据模型,使其拥有一般系统拥有的功能,它可以增加读者信息,可以对新书进行入库,删除旧书,可以查询所有...

    实验1答案 - 建立学生数据库.sql

    如选择“混合模式(SQL Server身份验证和Windows身份验证)”表示除了可以用使用登录到Windows的帐号作为登录的依据外,还可以使用SQL Server系统的帐号登录,这里必须为内置SQL Server系统管理员账户(SA)提供一个...

    基于Jsp的图书馆管理系统毕业论文(源码+数据库+sql+word毕业论文文档).zip

    本系统中解决了学校图书管理事务中的常用基本问题以及相关统计工作。本系统中包含6个功能模块:系统设置,读者管理,图书管理,图书借还,系统查询和更改口令。 本系统使有jsp进行网页界面的设计,使用MVC设计模式,...

    互动社区II 独立服务器Sql版(无限制完整)

    我发出的目的是希望能有人帮我解决社区里面的虚拟形象问题 这是没有限制和不需要域名捆绑的! 同时也是商业版本!请只用于研究和学习,商业用途请向http://www.activepower.net购买! 虚拟形象的图片是调用QQ的,但...

    Jsp图书馆管理系统软件设计(软件源码++数据库+sql本科毕业论文WORD文档资料).zip

    本系统中解决了学校图书管理事务中的常用基本问题以及相关统计工作。本系统中包含6个功能模块:系统设置,读者管理,图书管理,图书借还,系统查询和更改口令。 本系统使有jsp进行网页界面的设计,使用MVC设计模式,...

    基于Asp Sql Server技术的

    通过项目的实践,网上成绩管理系统的应用解决了家在外地的同学查成绩的不方便等居多问题,也可以使学生及其家长方便的了解学生在校的学习情况,解决了老师和管理员的担忧,减轻了学校信息管理的压力,操作也很方便和...

    《库管大师(SQL Server 2000 网络版)》

    该软件以库存管理为主要线索,提供了一套完整的库存管理解决方案。支持常用的出库、入库、盘点、调拨、实时库存;支持一种货品多个型号、多个仓库情况的管理;支持货品的无限分级分类;支持先进先出、后进先出、移动...

    数据库原理(第5版)

    第4章使用实体-关系(E-R)模型解决数据建模问题,其中包括对数据建模的需求、基本的E-R术语和概念,并提供了一个简短的E-R建模示例应用程序(Heather Sweeney Designs)。第5章讲述了数据库设计,解释了规范化的基本...

    图书信息管理系统的设计与实现 论文

    过查看参考书来解决问题。另外一个存在问题比较多的地方是数据库的实现,比 如编程,对于这个问题只能通过多练习一些简单的编程,同时积极地利用图书馆 和网络资源,多查阅一些相关资料,多和老师、同学交流讨论。 ...

    PLSQLDeveloper下载

    PL/SQL的出现正是为了解决这一问题,PL/SQL是一种过程化语言,属于第三代语言,它与C、 C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。本文主要介绍PL/SQL的编程基础,以使入门者对PL/SQL...

    基于SQLServer和 Eclipse开发环境工厂进销存管理系统软件程序源码+数据库+WORD毕业设计论文文档.zip

    我这样做的主要目的是为了能够从技术手段的角度来阐述怎样解决我国现代的陶瓷生产厂家如何从原来传统的人工管理模式向现代化的信息化的管理模式的转变,除此之外还有陶瓷工厂的进销存系统在陶瓷工厂管理信息化中所起...

    MyEclipse连接MySQL数据库报错解决办法

    我们现在一般网站都是利用的MySQL数据库搭建网站的,但是在网上看到很多网友吐槽数据库连接不上的问题,现在我就结合相关资料向提出一些我个人的见解,希望对大家解决问题有帮助。 一般MySQL连接不上,可能有两大...

    Laravel开发-laravel-dag-manager

    Laravel开发-laravel-dag-manager 针对Laravel的基于SQL的有向无环图(DAG)解决方案。

    PIC CMS图片网站管理系统 v1.2.ZIP

    1.1版本升级为1.2数据库升级请依此按照下面四部进行(SQL运行器直接运行下面4句SQL,分四次,不能一次进行,去掉前面1-4序列号): 1:ALTER TABLE `pc_article` ADD `xiazai` VARCHAR(800) CHARACTER SET utf8 ...

Global site tag (gtag.js) - Google Analytics