延續上篇國内機票計算的話題,依然聚焦機票計算層,擴大範疇到國際。國際機票的差別在于會做更多的拼接,若所有資料全部參與計算則耗時過長,需要挑選一部分,還要保證挑選的部分恰好對應最低的價格。國際機票的有趣之處在于決定怎麼挑。
一、國際機票單程
1、由于多數情形需要中轉,不再适用運價*座位*規則的笛卡爾積
座位對應的航班組合比較多,如果沿用笛卡爾積,則花費時間的放大倍數與平均航班組合數相當
示例:兩段的中轉
2、挑選部分規則來降低比對次數
(1)、将運價與航班組合按運價分組
(2)、用運價與規則比對并計算價格,進而對規則排序
(3)、将運價與航班組合,從排序後的規則裡挑選部分,來生成票價
注:stop條件并非實際場景,eg.算出一個便stop;一個商家隻算一個價格
二、國際機票往返
1、與國内不同,兩個運價拼接往返運價的模式為常态
國内的往返運價通常是已經組合好的,而國際的場景是設定一個運價是否适用于去程/回程,并動态去組合的。
2、拼接将時間複雜度放大到n2
國内往返運價、規則是拼好的,僅航班需要拼接,延用笛卡爾積方式還能接受
國際運價、航班、規則都需要拼接,都放大為n2,很可怕
3、挑選部分運價、航班、規則來降低比對次數
(1)、對運價的挑選:隻保留低于同航司運價組合價格的混航司運價組合;對航班的初篩:至少與一個去程運價比對的航班才放入去程航班集合,至少與一個返程運價比對的航班才放入返程航班集合
(2)、從排序後的運價、排序後的航班裡挑選一些比對生成運價與航班組合
注:圖例的stop條件為算出一個航班便停止,實際模型更複雜一些
(3)、挑選部分規則與運價航班組合比對(和國際單程類似,不再贅述)
三、國際機票多程
1、兩程采用和往返同樣的計算方式
2、大于兩程,則采取多次查詢兩程的計算結果,并拼接
四、解決時間複雜度放大問題的思路
1、預篩選,來降低數量
2、分組,用比對分組取代比對單個元素,進而降維
3、排序,便于後面的挑選
4、按順序做比對,達到一定條件就stop