天天看點

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

延續上篇國内機票計算的話題,依然聚焦機票計算層,擴大範疇到國際。國際機票的差別在于會做更多的拼接,若所有資料全部參與計算則耗時過長,需要挑選一部分,還要保證挑選的部分恰好對應最低的價格。國際機票的有趣之處在于決定怎麼挑。

一、國際機票單程

1、由于多數情形需要中轉,不再适用運價*座位*規則的笛卡爾積

座位對應的航班組合比較多,如果沿用笛卡爾積,則花費時間的放大倍數與平均航班組合數相當

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

示例:兩段的中轉

2、挑選部分規則來降低比對次數

(1)、将運價與航班組合按運價分組

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

(2)、用運價與規則比對并計算價格,進而對規則排序

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

(3)、将運價與航班組合,從排序後的規則裡挑選部分,來生成票價

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

注:stop條件并非實際場景,eg.算出一個便stop;一個商家隻算一個價格

二、國際機票往返

1、與國内不同,兩個運價拼接往返運價的模式為常态

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

國内的往返運價通常是已經組合好的,而國際的場景是設定一個運價是否适用于去程/回程,并動态去組合的。

2、拼接将時間複雜度放大到n2

國内往返運價、規則是拼好的,僅航班需要拼接,延用笛卡爾積方式還能接受

國際運價、航班、規則都需要拼接,都放大為n2,很可怕

3、挑選部分運價、航班、規則來降低比對次數

(1)、對運價的挑選:隻保留低于同航司運價組合價格的混航司運價組合;對航班的初篩:至少與一個去程運價比對的航班才放入去程航班集合,至少與一個返程運價比對的航班才放入返程航班集合

(2)、從排序後的運價、排序後的航班裡挑選一些比對生成運價與航班組合

機票分享第三篇 機票計算過程及時間複雜度(國際篇)

注:圖例的stop條件為算出一個航班便停止,實際模型更複雜一些

(3)、挑選部分規則與運價航班組合比對(和國際單程類似,不再贅述)

三、國際機票多程

1、兩程采用和往返同樣的計算方式

2、大于兩程,則采取多次查詢兩程的計算結果,并拼接

四、解決時間複雜度放大問題的思路

1、預篩選,來降低數量

2、分組,用比對分組取代比對單個元素,進而降維

3、排序,便于後面的挑選

4、按順序做比對,達到一定條件就stop

繼續閱讀