火車票餘票問題的演算法解析 續

2021-09-11 15:01:58 字數 1815 閱讀 6787

在之前的文章中,我分析了火車票餘票的問題,提供了乙個高效的演算法。在本文中,我們繼續討論無座位號的餘票計算以及逐票更新的問題。  之前的分析參見: 

還是以站點數=6, 座位=5為例

如果不考慮座位號,我們只需要考慮每站售出的票數即可。

(1-2)的餘票數即為 總票數減去售票數 5 - 2 = 3

(2-3)的餘票數即為 總票數減去售票數 5 - 3= 2

以此類推

(1-3)的餘票數即為 總票數減去 (1-2)和(2-3)售票數較大者   即  5- max(2,3) = 2

(2-4)的餘票數即為 總票數減去 (2-3)和(3-4)售票數較大者   即  5- max(3,4) = 1

以此類推

計算餘票的公式

設定 ti 代表從i站到i+1站的售票數, 如t1 = 2, t2=3

以t(i,j)表示從 i站到j站的售票數

t(i,j) = 總票數  -  max(ti, ti+1, ... tj-1)

同理,如果用ri代表從i站到i+1站的餘票數

以r(i,j)表示從 i站到j站的售票數

r(i,j)  = min(ri, ri+1, ... rj-1)

對應的餘票表:

只需要計算和儲存每個站點段的餘票數,就可以更新任意兩個站點的餘票數或整張餘票表。

由此可以看出無座位號的餘票計算方式更簡單更快。

如果想要每購買一張票之後就更新餘票表,即無需更新整張表,而只需更新受到影響的部分站點。

無座位號逐票更新

我們看一下無座位號逐票更新的例子。(行表頭是起點站, 列表頭是到達站)

假設每站總票數為10,現在購買了3-4站的一張車票,那麼更新的範圍是其右上方的矩形。

影響的範圍對於(i,i+1)站段來說是:  行從0到i, 列從i+1到終點站的矩形範圍。

如果再購買一張4-5的票,新的餘票表如下:

在更新餘票的時候我們逐個比較餘票的值,

如果餘票本來的值比新的值大,則更新為新的值;

如果餘票本來的值已經小於新的值,則無需更新。

以購買一張3-4站,然後購買一張3-5站為例

有座位號的逐票更新

有座位號的逐票更新餘票邏輯相對簡單,只需要把更新範圍內的集合都更新一遍即可。

以購買一張3-4站車票為例:

將影響範圍內的集合都更新一遍,如果該座位已被包含,可以跳過之後的座位更新。(具體細節不做累述)

同樣採用位圖法,可以獲得很好的效能。

本文對火車票餘票問題的無座位號餘票更新和逐票更新的情況做了詳細的分析。

逐票更新的效能超過更新整張表,但是如果對每張票都做更新總體上需要消耗更多的資源和時間。

具體要視實際需求而定。

火車票餘票問題的演算法分析

多執行緒賣火車票的問題

同步 塊 synchronized object 其中object為我們使用的同步鎖,對於繼承的方式,使用this或者建立乙個非靜態物件作為鎖是無用的,無法阻止錯誤資料的產生。所以我們使用static的物件 同步方法 public synchronized void method 由於同步方法的鎖使...

解決買火車票問題的方案。

解決買火車票問題的方案。日期 2009 01 14 13 54 分享 收藏 雖然在這裡討論,也沒啥大用,但自己的觀點還是說說吧。有人說解決買票難要各省分開過年,呵呵,乙個工廠裡一半湖南工人,一半四川工人,四川工人回去過年了,湖南工人還幹不幹活了?又有人說,要實名制。這個初看下,似乎滿能解決問題的,但...

給火車票刷票外掛程式拍磚的專家們的一封信

你們好 我是一名普通的農民工,網名無水乙醇。最近看到大家向諸如360瀏覽器,獵豹瀏覽器的火車票刷票外掛程式猛烈攻擊,也看到cctv這個強大的平台予以 我不大懂多大的技術,但是我想從我的角度說說。我過年也要回家,但是普通售票點和 購票都無法進行購票成功。我是熱門線路京九線吉安站的,人數超級多,購票者8...