如何有效地存储位置和路径,找出最短的旅行路线

时间:2015-03-29 02:59:16

标签: mysql oracle postgresql database-design

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

         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处有很多间接路径。

请帮助我

感谢 问候

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于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);