鐵路售票系統的庫存是怎麼計算的?
- 假設有一列火車,10個座位,從1到10;
- 有五個站,從A到E,其中應該是4個區間;
那麼庫存是有40個么?就是每個座位對應每個區間都有庫存,我要買從A到E的票,是不是購買的時候就是買了座位1的A-B,B-C,C-D,D-E,四張票?
見:
如何評價一年多前沸沸揚揚的12306NG開源項目?是失敗了嗎?如果失敗了,能從中獲得什麼教訓?
我以北京西到深圳北的G71次高鐵為例(這裡只考慮南下的方向,不考慮深圳北到北京西的,那是另外一個車次,叫G72),它有17個站(北京西是
01號站,深圳北是17號站),3種座位(商務、一等、二等)。表面看起來,這不就是3個商品嗎?G71商務座、G71一等座、G71二等座。大部分輕易
噴12306的技術人員(包括某些中等規模公司的專家、CTO)就是在這裡栽第一個跟頭的。實際上,G71有136 * 3 = 408種商品(408個SKU),怎麼算來的?請看:
如果賣北京西始發的,有16種賣法(因為後面有16個站),北京西到:保定、石家莊、鄭州、武漢、長沙、廣州、虎門、深圳。。。。都是一個獨立的商品,
同理,石家莊上車的,有15種下車的可能,以此類推,單以上下車的站來計算,有136種票:16+15+14....+2+1=136。每種票都有3種座位,一共是408個商品。
好了,再看出票時怎麼減庫存,由於商務、一等、二等三種座位數是獨立的,庫存操作也是一樣的,下文我就不再提座位的差別的,只討論出發與到達站。另外,下文說的是理論世界的模型,不是說12306的資料庫就是這麼設計的。
旅客A買了一張北京西(01號站)到保定東(02號站)的,那【北京西到保定東】這個商品的庫存就要減一,同時,北京西到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳等15個站台的商品庫存也要減一,也就是說,出一張北京到保定東的票,實際上要減16個商品的庫存!
這
還不是最複雜的,如果旅客B買了一張北京西(01號站)到深圳北(17號站)的票,除了【北京西到深圳北】這個商品的庫存要減一,北京西到保定東、石家
庄、鄭州、武漢、長沙、廣州、虎門等15個站台的商品庫存也要減1,保定東到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳北等15個站台的商品庫存要減
1。。。總計要減庫存的商品數是16+15+14+。。。。+1=120個。當然,也不是每一張票都的庫存都完全這樣實時
計算,可以根據往年的運營情況,在黃金周這樣的高峰時段,預先對票做一些分配,比如北京到武漢的長途多一點,保定到石家莊的短途少一點。我沒有證據證實鐵
道部這樣做了,但我相信,在還沒有12306網站的時候,鐵道部就有這種人工預分配的策略了。想像一下,8萬人舉著錢對你
高喊:賣給我。你好不容易在錢堆里找到一隻手,拿了他的錢,轉身找120個同事,告訴他們減庫存,而這120個同事也和你一樣被8萬人圍著;也和你一樣,
每賣出一個商品要找幾十個人減庫存。。。這就是12306動態庫存的變態之處。比你平時買東西的任何網站的庫存機制都複雜幾十上百倍。
一般來說:系統會存儲最長的A-E一張未售車票,另外有表存儲該趟列車的停靠在。如果旅客購買C-D的車票,那麼系統會自動生成A-C和D-E兩張未售車票,以供再次利用發售;同樣如果再售出一張B-C車票,系統還會再生成A-B未售車票可供發售。 真實系統還要複雜的多,比如車票一開始要盡量賣給長途旅客,要限制A-B、A-C這類的購票需求,什麼時候才允許B、C、D等車站售出A車站始發的車票,售出車票後的前程和後程席位是繼續使用原有席位號還是使用無座席別,是否需要生成新席位,什麼時候生成等等問題都需要解決。 而且根據客流規律,系統不會將全部席位保留為A-E類型,會將一些席位在開始預售前就裂解成A-B/B-D/D-E等多段類型,並配合不同的銷售策略銷售。
鐵路系統的庫存應該沒有這麼簡單,如果有A,B,C,D,E這五個站點,那麼有可能的區間有:
A-B, A-C,A-D,A-E,B-C,B-D,B-E,C-D,C-E,D-E這十個,
但是有一些是想衝突的,比如如果把 1 號座位賣給了一個 A-D 的客人,那麼該座位的 A-B,A-C,B-C,B-D,B-E,C-D,C-E 都不可用了,只有 D-E 這個還可賣,所以,1號座位在賣出 A-D 這一張之後,1號的庫存就為1,即 D-E。其它的座位也是一樣的的道理。
——————————更新——————————
剛才重新理解了一下題主的說明文字,感覺這個也不錯,基於 A-B,B-C,C-D,D-E 這樣的區間庫存的話,買票的時候其實應該就是把一張票和幾個連續的區間綁定,比如賣了 B-D的,那麼 B-C,C-D就庫存為0了,但是這種方法和我上面那種好像都沒法計算出真實庫存……
根據買票的經驗來說,現在的系統應該不是這麼設計的吧……題主你說的是理論的情況,如果我是運營公司,有人故意搗亂,買第一站到第二站的票,那麼想從第一站到最後一站的人幾乎沒人能買到票了,運營公司也會受很大損失,所以可能的情況是一段一段分開了。而且有賣遠距離票的衝動。
有一個想法不知靠不靠譜,如有錯誤請大神們指正。
列車停靠站再多一般也不會超過62個吧,算上首尾兩站剛好64(即便再多也可以的)假定這車1000個座位,那就new一個長1000的long型數組,每位表示一個站,每個下標表示一個座位,沒賣出去就是0,賣出去就是1,賣票退票查票用 與 或 異或 遍曆數組就可以了吧。像Redis一樣,單線程(單純的查票不買票不要一致性了無所謂)超過64就開二維數組64*2=128怎麼也夠了題主的的那種方法感覺有問題,比如,如果在始發站A站,賣出的車票的終點站都是B站以後的,那麼,想在B站上車的乘客豈不是不行了。當然,我也不知道火車的售票究竟是如何具體進行的。本人的猜測是這樣,第一輪售票將10個座位按照始發站的不同以一定比例分開,比如以A站為始發站的有4張,以B為始發站的有3張,以C為始發站的有2張,以D站為始發站的有1張,然後這樣不同的始發站正好可以保證到達剩下的任意站台有一張票。第一輪售票結束後根據結果再分配旅客下車後產生的空位。。。以上僅是個人臆測,如有錯誤還望大家原諒!
這個世界上,有一種數據結構,叫做線段樹。一步一步理解線段樹
推薦閱讀:
※我覺得現在的工作學不到東西,要不要換工作呢?
※普通黑客也能月入8萬美元?揭秘地下網路黑產鏈!
※如何看待嗶哩嗶哩科技區軍事板塊改名「星海」?
TAG:電子商務 | 資料庫 | 演算法 | 網站運營 | 12306中國鐵路客戶服務中心 |