簡體   English   中英

如何有效地存儲位置和路徑並找出最短的旅行路線

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM