程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL 實現最優坐地鐵方案(3)

SQL 實現最優坐地鐵方案(3)

編輯:關於SqlServer

  結果, 2/3 是換乘次數(應該減一, 將上面代碼中初始化 line_count 的地方從1改成0即可):

  3{1.廣州東-> 2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 2 5

  1{1.廣州東-> 2.體育中心-> 3.體育西)-> 3{2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 3 7

  數據的問題, 我的算法依賴於 orderid 來搜索下一站, 如果這個不連續, 則無法搜索下一站

  所以把數據改成下面的就行了

  SQL code 

DECLARE @tb TABLE(
    lineID int, state nvarchar(10), orderid int)
INSERT @tb
SELECT 1, N'廣州東', 1  UNION ALL
SELECT 1, N'體育中心', 2  UNION ALL
SELECT 1, N'體育西', 3  UNION ALL
SELECT 1, N'烈士陵園', 4  UNION ALL
--SELECT 1, N'公園前', 6  UNION ALL  -- 這裡站點斷開了, 我的搜索要求連續
--SELECT 1, N'西門口', 7  UNION ALL
SELECT 1, N'公園前', 5  UNION ALL  -- 這裡站點斷開了, 我的搜索要求連續
SELECT 1, N'西門口', 6  UNION ALL
SELECT 2, N'火車站', 1  UNION ALL
SELECT 2, N'紀念堂', 2  UNION ALL
SELECT 2, N'公園前', 3  UNION ALL
SELECT 2, N'中大', 4  UNION ALL
SELECT 2, N'客村', 5  UNION ALL
SELECT 2, N'琶洲', 6  UNION ALL
SELECT 2, N'萬勝圍', 7  UNION ALL
SELECT 3, N'廣州東', 1  UNION ALL
SELECT 3, N'體育西', 2  UNION ALL
SELECT 3, N'珠江新城', 3  UNION ALL
SELECT 3, N'客村', 4  UNION ALL
SELECT 3, N'市橋', 5  UNION ALL
SELECT 4, N'萬勝圍', 1  UNION ALL
SELECT 4, N'金洲', 2


  修改後的執行結果(換乘數已經改成初始化為0)

  3{1.廣州東-> 2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 1 5

  3{1.廣州東-> 2.體育西)-> 1{3.體育西-> 4.烈士陵園-> 5.公園前)-> 2{3.公園前-> 4.中大} 2 6

  1{1.廣州東-> 2.體育中心-> 3.體育西-> 4.烈士陵園-> 5.公園前)-> 2{3.公園前-> 4.中大} 1 6

  1{1.廣州東-> 2.體育中心-> 3.體育西)-> 3{2.體育西-> 3.珠江新城-> 4.客村)-> 2{5.客村-> 4.中大} 2 7

  如果 orderid 在實際數據中確實有不連續的問題, 則可以在處理之前先把數據導到臨時表, 生成連續的 orderid, 再用我的算法來查詢結果。這次的算法相比之前的算法有改進, 只有換乘才會判斷是否已經走過此線路, 其他方面也略有調整, 應該比以前的好。你可以測試一下!

  實際使用時, 算法上可以稍做調到:

  1. 直接計算出 next_orderid, 而不是每次用 flag 去算, 這樣可以提高 join 效率

  2. 表變量改成臨時表, 這樣可以在相關的列上建立索引, 從而更快的與原表 join (當然, 原表相關的列上也要有索引)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved