【问题标题】:How to efficiently store locations and path efficiently and find out the shortest travel route如何高效地存储位置和路径,找出最短的旅行路线
【发布时间】:2015-06-02 05:25:03
【问题描述】:

我在解决面试问题时卡住了。

         place C

place A----------Place B


      place D

假设我可以通过 3-4 条路径从 A 地到达 B 地(直接路径和间接路径)。

我必须存储它们并检索最短路径。

我可以做表格,但它无法选择最短距离的路径。

我创建了如下表格。

table1:
create LocationDetails(
  locnid integer primary key,
  locnname text
  );

table 2:
create PathDescription(
  pathid integer primary key,
  startlocnid integer,
  endlocnid integer,
  distance integer
  );

ALTER TABLE PathDescription
  ADD CONSTRAINT fk_PathDescription1
  FOREIGN KEY (startlocnid)
  REFERENCES Persons(locnid);

ALTER TABLE PathDescription
  ADD CONSTRAINT fk_PathDescription
  FOREIGN KEY (endlocnid)
  REFERENCES Persons(locnid);

但现在的问题是选择一条覆盖最小距离的路径 从 A 地到 B 地有很多间接路径。

请帮帮我

谢谢 问候

【问题讨论】:

  • 您已经为三个不同的数据库标记了这个问题。那你用的是哪一个?
  • 如果您需要在加权图中实现路径查找,那么关系数据库 + sql 一开始就是一个失败的解决方案。
  • @zerkms:请解释一下,否则看起来像一个意见。
  • @FrankHeikens 图结构不太适合关系 DBMS,尤其是当您需要对其执行操作时。您的回答证明:您没有提供纯 SQL 解决方案,而是提供了一个以编程语言实现它的 postgresql 扩展的链接,并且 DBMS 用作虚拟存储(在这种情况下,它并不比纯文本文件好)。
  • @zerkms:不比纯文本文件好?我很确定 Oracle 和 PostgreSQL 在 GIS 和最短路径计算方面不仅仅是纯文本。它可能并不完美,但它几乎适用于任何情况。

标签: mysql oracle postgresql database-design


【解决方案1】:

要选择最短路径,您应该使用 Dijkstra 算法,您会在 google 上找到很多信息和实现。

在维基百科中还有一个伪代码 sn-p :http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

【讨论】:

    【解决方案2】:

    使用 PostgreSQL 时,您可以使用 PostGIS 和 pgRouting。最短路径计算得到很好的支持。

    【讨论】:

      【解决方案3】:

      对于 Oracle,您可以使用此递归查询:

      with t(l1, l2, path, dist) as (
        select loc_id_start, loc_id_end, 'A'||loc_id_end, distance
          from paths where loc_id_start = 'A'
        union all
        select loc_id_start, loc_id_end, path||loc_id_end, distance+dist
          from paths, t where t.l2 = paths.loc_id_start )
      select path, dist from t where l2 = 'E'
      
      PATH  DIST
      ----- ----
      ABE     11
      ACE     10    <- shortest path 
      ADE     14
      ABCE    15
      ACDE    16
      ABDE    24
      ABCDE   21
      

      并选择与结果距离最小的行。

      SQL Fiddle 现在似乎无法正常工作,所以这是我使用的表和数据:

      create table paths
      ( loc_id_start varchar2(5),
        loc_id_end varchar2(5),
        distance number
      );
      
      insert into paths values ('A', 'B', 7);
      insert into paths values ('A', 'C', 8);
      insert into paths values ('A', 'D', 9);
      insert into paths values ('B', 'C', 6);
      insert into paths values ('B', 'D', 12);
      insert into paths values ('C', 'D', 3);
      insert into paths values ('B', 'E', 4);
      insert into paths values ('C', 'E', 2);
      insert into paths values ('D', 'E', 5);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多