導(dǎo)游
相信大家都應(yīng)該有搶火車票的經(jīng)驗。每年年末都是盛宴。
然而你有沒有想過搶火車票這個算法是怎么實現(xiàn)的呢?其實并沒有你想的那么難。位運(yùn)算
先回顧一下位運(yùn)算:
12306搶票算法詳解
我們以北京到西安這趟高鐵為例,比如我的路線就是從北京到西安,車上如果只剩最后一張票了,那么如果有其他人,在北京到西安這條路線之間買任何一站,那么我都是買不了票的,換句話說,對于單個座位來說,必須是起點(diǎn)到終點(diǎn)之間的所有站都沒有人買的話,那么才能被算是有票狀態(tài)。
所以我們可以嘗試用redis的bitmap結(jié)合上位操作來實現(xiàn)這種場景,以上述北京到西安為例,我們把問題簡化:
- 比如一個火車上只有4個座位;
- 北京到西安,一共是4站,其實是三個區(qū)間的,分別為北京->石家莊,石家莊->鄭州,鄭州->西安。
首先我們給每個區(qū)間構(gòu)建一個空位圖(0為有票,1為無票)。
接下來,比如有人買了一張從北京到西安的票。
買票這個動作,比如被分配到的座位是編號為1的座位,那么我們直接把北京到西安的所有站,1號座位全部設(shè)置為1,如下圖:
接下來又有人買了一張從石家莊到西安的票。
比如這次分配的是座位2,那么我們把石家莊到西安的所有票全部設(shè)置為1就行了,如下圖:
如何知道還剩幾張票?
其實解決這個問題很簡單,我們直接把上述位圖做一個或操作就可以了,因為或操作是必須全部都為0,才為0。
或操作結(jié)果有幾個0,則說明還剩幾張票。
總結(jié)
其實解決這個問題主要在于位圖的構(gòu)建,因為火車票對于某一個座位來說,只要起點(diǎn)到終點(diǎn)中間某一個區(qū)間被占用了(置為1),那么整個座位都是無效的這個特點(diǎn),很容易想到用或操作的結(jié)果來判斷買票結(jié)果,我們這里只用了4位是為了方便說明問題,實際中應(yīng)該是火車上有多少座位,位圖的長度就應(yīng)該是多少。
1.《【12306搶票攻略】專題12306 搶票算法被曝光了,居然這么簡單》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【12306搶票攻略】專題12306 搶票算法被曝光了,居然這么簡單》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/2128483.html