`
linxuexin
  • 浏览: 26933 次
  • 性别: 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;

分享到:
评论

相关推荐

    PL_SQL在求解最短路径问题中的应用.pdf

    本文使用 Oracle 的 PL/SQL 语言实现了有向图的最短路径问题的解决方案,该方法可以解决复杂的有向图问题。 知识点4:算法设计思想 本文的算法设计思想是借用广度优先的思想,利用 Oracle 的 PL/SQL 语言实现了有...

    MADlib-基于SQL的数据挖掘解决方案-图算法之单源最短路径.docx

    图可以分为有向图和无向图。在有向图中,边有方向;而在无向图中,边没有方向。此外,图还可以带有权重,表示边的重要程度或者成本。 **图的表示方法**主要有两种:邻接表和邻接矩阵。邻接表适用于稀疏图,即边的...

    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 ...

    C#绘制曲线示例源码(含SQL数据库),c#绘制曲线图,C#

    在这个项目中,可能会有专门的类或方法用于连接数据库、执行SQL查询、解析结果并使用GDI+或WPF来绘制曲线。 7. **绘图步骤**: - 连接数据库:使用ADO.NET(如SqlConnection)建立与数据库的连接。 - 执行查询:...

    SQL Server Management Studio 19.3

    3. **查询编辑器**: SSMS内置的T-SQL查询编辑器支持语法高亮、自动完成和错误检查,有助于编写和调试SQL语句。同时,它还支持执行计划的查看,帮助优化查询性能。 4. **数据导入与导出**: SSMS允许用户方便地将数据...

    实验二《用SQLQuery工具和SQL语句 创建数据库与相应的表》

    9. **实验报告**:实验完成后,学生需要编写实验报告,记录实验过程、结果以及遇到的问题和解决方案,这有助于巩固理论知识,提高问题解决能力。 通过这个实验,学生不仅可以掌握SQL语言的基本语法,还能理解数据库...

    help.sql 脚本

    本文将深入探讨一个名为"help.sql"的脚本,它作为数据库安装或配置的辅助工具,提供了方便快捷的解决方案。 SQL脚本,简单来说,是一系列预定义的SQL命令集合,用于执行特定任务,比如创建表、插入数据、更新记录或...

    图:有向图实现

    在这个主题中,我们将深入探讨有向图的概念、实现方式以及如何在JavaScript中使用它们,同时也会涉及查询语言的相关知识。 首先,让我们理解有向图的基本概念。有向图是由节点(或顶点)和边构成的集合,其中每条边...

    微软数据库SQL语言帮助

    这个文件可能包含了Jet SQL的语法参考、示例和问题解决方案,对于使用Access进行数据库开发和管理的人员非常有用。 总结,SQL语言是数据库管理的核心工具,无论是在微软SQL Server还是Access中,理解并熟练掌握SQL...

    SQL数据库新闻管理系统

    总之,SQL数据库新闻管理系统是一个集数据存储、信息管理、用户交互于一体的解决方案,它的实现涉及到SQL语言、数据库设计、安全性、性能优化等多个方面的知识。通过这样的系统,可以高效地维护和发布新闻信息,满足...

    Microsoft Jet SQL参考

    你可以通过`CREATE TABLE`语句定义表结构,使用`ALTER TABLE`改变已有表的结构,以及`DROP TABLE`来删除不再需要的表。 ### 2. 数据操作 - **插入数据**:使用`INSERT INTO`语句向表中添加新记录。 - **更新数据**...

    sql 图书馆管理系统

    SQL Server是微软公司开发的关系型数据库管理系统,它提供了丰富的工具和功能,支持复杂的数据处理和高可用性解决方案。在图书馆管理系统中,可能使用SQL Server来存储和管理图书、读者和借阅记录等信息。 6. **...

    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 ...

    SQLSERVER表导入EXCEL 小工具

    使用此工具时,有几点需要注意: 1. 确保你的系统已经安装了Microsoft Office,因为Interop组件依赖于Office的COM接口。 2. 数据量较大时,应考虑分批导入或优化查询以避免性能问题。 3. 考虑数据格式的兼容性,例如...

    python+sql sever 数据库系统大作业实验 教学信息管理系统

    实验报告则记录了整个项目的设计思路、实施步骤、遇到的问题及解决方案,是对整个实验过程的总结和反思。通过阅读实验报告,我们可以学习到如何从需求分析到系统实现的全过程,这对于理解和提高数据库应用开发技能...

    SQL教学经典案例

    ### SQL教学经典案例知识点解析 #### 一、SQL案例概览 本文档提供了一系列SQL案例,旨在帮助初学者和专业人士更好地理解和应用SQL语言。...这些案例不仅有助于加深对SQL的理解,也为解决实际问题提供了有效的参考。

    sql server开发教程,让你快速学会sql server

    SQL Server是一款广泛应用于企业级数据管理的数据库管理...本教程中的案例涵盖了以上所有方面,通过学习和实践,你将能熟练掌握SQL Server的使用,无论是开发高效的应用程序,还是管理企业级的数据仓库,都将游刃有余。

    关于ASP与SQL Server 2000间图像文件存取的研究和实现.pdf

    文章通过对ASP与SQL Server 2000间图像文件存取的研究和实现,提出了使用ActiveX服务器组件来解决图像数据存储和读取的需求,这一研究不仅具有理论意义,而且在实际应用中,如商品展示、网络调查等Web应用场合具有...

Global site tag (gtag.js) - Google Analytics