[英]How to efficiently store locations and path efficiently and find out the shortest travel route
我在解決面試問題時陷入困境。
place C
place A----------Place B
place D
假設我可以從A到B到達3-4條路徑(直接和間接路徑)。
我必須存儲它們並檢索最短路徑。
我可以做桌子,但我不能選擇最小距離的路徑。
我創建了如下表。
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的間接路徑太多,因此選擇的路徑將覆蓋最小距離。
請幫我
感謝和問候
要選擇最短路徑,您應該使用Dijkstra算法,您會在Google上找到很多信息和實現。
在Wikipedia中,還有一個偽代碼段: http : //en.wikipedia.org/wiki/Dijkstra%27s_algorithm
使用PostgreSQL時,可以使用PostGIS和pgRouting 。 最短路徑計算得到很好的支持。
對於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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.