在解决面试问题时我被困住了。
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处有很多间接路径。
请帮助我
感谢 问候
答案 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);