項目需求
- 實現一個幫助進行地鐵出行路線規劃的命令行程序
- 地鐵線路圖數據須要與執行程序解耦
- 支持查詢單條線路的全部站點
- 支持查詢任意兩站之間經過最少站數的路線
算法設計
項目中最主要的點在於:找出兩個站點之間經過最少站數的路線。該點對應的經典模型是「在一個無向圖中找出兩點之間的最短路徑」。各個站點即爲無向圖中的點,兩站間的路徑即爲無向圖中鏈接兩個節點的邊,在此需求下,全部邊的長度均爲1
。算法
地鐵最短路的換乘,最貼近實際的狀況是「一次初始化,屢次查詢」,即在地圖肯定下來以後可能會有若干次不一樣點對的查詢。而本需求中地鐵線路圖數據須要與執行程序解耦,每次查詢對於地圖數據均可能是不一樣的,因此初始化的時間應該均攤到每次查詢中去。因爲地鐵地圖屬於稀疏圖,故能夠用SPFA
算法解決。學習
細節上,爲了解決兩條線路覆蓋的狀況下(見下圖),連續換乘的問題,須要更好的換乘算法。測試
解決方法:經過判斷站點和前繼站點的所在線路是否有重疊來判斷是否須要換乘。編碼
存儲設計
數據存儲上,能夠採用存點/存邊兩種形式。在本項目中,存邊會明顯優於存點。spa
- 簡潔易懂。數據中每一個條目表示兩個站點中的一條通路。
- 易於擴展。添加站點方便;數據不須要有序。
- 方便應用程度讀取。數據中每一個條目即爲圖中的一條邊,方便建圖。
具體到內容,整個數據文件能夠被幾條線路分紅幾個大的模塊,每一個模塊存一條線路的數據,因爲地鐵站名不存在同名的狀況,能夠不存線路換乘站點的信息,經過同名同名判斷便可。因爲同一條邊不可能同時屬於兩條線路,因此在邊信息上不會存在冗餘。每一個模塊由一個星號(*
)開始,後面這個這條線的名稱。接下來包含若干條邊信息。每條邊信息的格式爲起點站名稱 終點站名稱
。每條線的起點能夠由建圖後入度爲 0
的點肯定。命令行
樣例以下:設計
* 1號線 劉院 西橫堤 果酒場 本溪路 ...(省略) 鹹水沽北 雙橋河 * 9號線 天津站 大王莊 大王莊 十一經路 ...(省略)
項目計劃表
項目計劃表 | 用時 |
---|---|
計劃 | |
· 估計這個任務須要多少時間 | 30min |
開發 | |
· 需求分析 (包括學習新技術) | 30min |
· 生成設計文檔 | 30min |
· 設計複審 (和同事審覈設計文檔) | 30min |
· 代碼規範 (爲目前的開發制定合適的規範) | 30min |
· 具體設計 | 30min |
· 具體編碼 | 1h |
· 代碼複審 | 1h |
· 測試(自我測試,修改代碼,提交修改) | 1h |
報告 | |
· 測試報告 | 1h |
· 計算工做量 | 1h |
· 過後總結, 並提出過程改進計劃 | 1h |
· 合計 | 9h |