火車票區間演算法 設計

白龍發表於2012-01-13

拋磚引玉, 考慮不周到的地方請大家提意見,在zhihu上也提問了 問題描述這樣, 一列火車有m個座位,n個區間段,現在有x個人上車,x< m*n, 當第i (a-b)個人上車時,必須能夠找到一個最優的座位(儘量利用已售過區間的座位,讓車票售出量最多) ,寫出查詢速度,訂票速度(包括取消票) 題中可知 m >> n

站點通過查詢將其轉化為一個自然數序列,方便計算 演算法1 現在看來效率比較低 我開始是這樣設計,仿照記憶體分配演算法, 暫且不考慮位元組優化 emptyRange{ short number short size nextRange } 每個座位是個SkipList

查詢 火車票是否有座就遍歷連結串列 找到 node.number <= a && node.number+size >=b 就認為有座

訂票 這個要求最優解 ,找產生碎片最小的情況,也就是說 size - (b-a) 是最小的,然後修改該空白node,如果分成兩個區間就增加一個node

取消 找到對應節點,把該空白區域加入到列表裡,需要合併的合併

匆匆想的,有些細節還沒考慮清楚,我是想大家一起討論下, 看看有沒有更好的演算法

Btw, 從關聯式資料庫 -> NoSql ->? 下一個是什麼呢?我想有沒有可能是自定義資料結構伺服器呢? Redis算是一個資料結構伺服器,目前不太清楚設計好一種演算法後,是否很容易整合進去。或者將來是否有一種開放的資料結構伺服器?資料結構伺服器上的資料者定期儲存或者同步到資料庫中。

剛才查了下 最多停靠站的火車是62個,車廂最長20節左右,客車座位數一節我們可以照200算(無坐也算) 一個座位最壞情況下 是n/2長連結串列,所有座位都是這樣,嗯,總共一列車最壞可以用到20*200* (2+2+4) * (62/2 * 1.33)大概是 1289600 1.2M個位元組 8G可用記憶體 可以儲存 8*1024*1024*1024/1289600 = 6661輛 沒有查到客列總數,想來不會超過一萬輛 照10000算 12天 20臺電腦也夠了

演算法 2 受無鋒之刃 演算法1 啟發

為所有區段生成一個二維陣列,排序如下

A B C D

B C D

C D

D

每個節點儲存該區間車票數量和車票

查詢 找到起始站點,再到其中找終點,從該點向下的節點都是有票得,然後再到起始站點-1 向下找 總共時間複雜度為O(i)

訂票 同查詢,找到該區段,如果沒有,就找終點+1, 然後,起點-1, 終點+2,交錯找下去,找到第一張票,複雜度O(i*(n-i)),找到之後將該區間分解,除去訂票區間,然後將剩餘的掛到相應的站點下

取消 遍歷,找以該票起始點為終點的空白段,和以該票終點為起始點的空白段,如果找到就合併,找不到就直接加入到以該票起始和終點統計的區段 還沒想好,如果遍歷需要花O(m)

相關文章