關於 12306 售票的一些思考研究

flc1125發表於2024-02-01

原文:flc.io/12306/

宣告:本內容不一定是官方實際應用情況,僅為個人思考研究的方案。

問題:

買過票的都知道,乘客可以選車次的某站到某站,那意味著這期間的站點,該座位是不可售的。

那麼,12306 是如何計算這個座位的售票情況的呢?

分析:

我隨便找了個深圳前往北京的車次 G82,以下是它的基本資訊:


我們在模擬幾位乘客購票後的資料:

如圖:1列-1A座位,因乘客1、乘客2把深圳北到駐馬店西站的座位給佔了,那意味著乘客三,如果想買,只能購買鄭州東站到北京西段的座位。


那我們在換一種形式來體現 1列-1A座位的售票情況:

在仔細看看,這不就是妥妥的二進位制嘛。


我們把 1列-1A座位的售票情況,轉換成二進位制,以及對應的十進位制,就是:

那麼剛開票時候的可售情況是怎麼表示呢?

是不是足夠清晰了!!


結論:

好,那我們在結合二進位制運算的視角來看看這個問題。

  • 剛開票的時候,可售站數是 2 ^ 所有站數 - 1,比如這個車次,就是 2 ^ 10 - 1 = 1023,我們用這個數代表可售情況。
  • 乘客1購票後,乘客佔的坑位是 15,怎麼算的?多個站之間位運算就好,比如 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + 2 ^ 3 = 15,我們用這個數代表乘客1佔的坑位。
  • 那乘客2此時如何想買票,怎麼知道它能買哪些呢?其實就是圖中空白區域。我們用 1023 ^ 15 = 1008 計算即可。
  • 乘客2購票後,可售就變成了:1008 ^ 48 = 960,也可以用 1023 ^ 15 ^ 48 = 960 計算。
  • ……


推廣:我寫的一個關於 Go 框架 Kratos 的元件庫:github.com/go-kratos-ecosystem/com... , 歡迎 Star。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
個人主頁:flc.io

相關文章