首頁 >web前端 >js教程 >javascript模擬訂火車票和退票範例_基礎知識

javascript模擬訂火車票和退票範例_基礎知識

WBOY
WBOY原創
2016-05-16 16:51:221455瀏覽

之前看到有人分析12306後台的邏輯。 。火車票的預定和退訂不同於普通的購物。
一個難題就是火車票可以分站來賣。例如,一張北京到上海的火車票,沿途可以有很多站,可以北京-濟南,濟南-南京...等等。如何設計資料模型來存取這些票是一個問題。而不是簡單的數量 -1.

其中看到一條思路挺好:用二進位字串來表示一張火車票,比如,北京到上海共10站,那麼一張全程票初始狀態表示為:'1111111111';
賣出一張全程票,則該票變為'0000000000';
賣出一張半程票,例如北京-濟南三站(第一站-第三站),則票變為'0011111111';
再賣出一張半程票,例如徐州-南京(第6站-第9站),則上一張票變為:'0011100011';

退訂票的邏輯就很簡單了,我要退一張(徐州-南京)的票,則從票池中找到第一張不能買
(徐州-南京)的票,更改它就OK(買票的逆向).例如,找到了上面的一張票'0011100011',
退票後,此票變為(0011111111);

基本邏輯如上,12306要保證多入口,而同時數據的一致性,需要很高效的邏輯來處理查票,
買票,退票的業務,據說高峰每秒會有20萬請求。將票的資料結構保存在記憶體中。而非資料庫。
小而有效率的資料結變得很重要。

複製程式碼 程式碼如下:

if(jQuery){}else{}
function Server(){

 var self = this;

 self.ticketsPool = [];

 self._init= function(number){

  if(typeof(number) != 'number')
   throw ('type error');
  for(iumber= ;i ){
   self.ticketsPool.push(new Ticket());
  }
 };

 //判斷一張票是否可以買,透過與或運算來實現。

 //例如:訂單o為北京-濟南(001111111),某張票為(0000000011)(已賣出北京-南京),那麼返回false
 //例如:訂單o為北京-濟南( 001111111),某票為(1111100011)(已賣出徐州-南京),那麼返回true
 self.canBuy = function(o,t){
  var _o = ''
  forj =0; j   _o = o[j]=='0'?1:0;
  }
  var r1 = (parseInt(t.tic,2) | parseInt(o,2)) & parseInt(_o,2);
  var r2 = parseInt(_o,2);
  return r1 == r2;
 };

 //賣出一張票

 self.pop1Ticket = function(o){
   for(i=0;i   (o,self.ticketsPool[i])){
     self.buy(self.ticketsPool[i],o);
     return i ;
 };

 //賣出票的實現,改變二進位字串,例如'111111111'->'001111111';
 self.buy = function(t,o){
 . t.tic,2) & parseInt(o,2)).toString(2);

  //alert(t.tic);


 };

 //查詢餘票

 self.remainTics = function(o){

   var count=0;

   for(i=0;i     count = self.canBuy(o,self.ticketsPool[i])?1:0;

  };
  return count;
 }

 //退票,或運算
 self.refund = function(o){
   for(i=0;i   . (o,self.ticketsPool[i])){

     var _o = ''

     for(j=0; j  for(j=0; j   0'?1:0;
     }
     self.ticketsPool[i].tic = (parseInt(self.ticketsPool[i].tic,2) | parseInt(_oString,2).toicketsPool[i].tic,2) | parseInt(_oString,22).to(2) ;
     return i;
   } 
  };

  return -1;
 }
}

//資料模型:票
function Ticket(){
 var self = this;

 //票的初始為全程票

 self.tic = '11111111111'; }

//資料模型:訂單
function Order(from, to){
 var self = this;
 var s = '';

 for(i=0;i  s = (i>=from && i }
 return s;
}

//12306後台
Server = new Server();
//初始狀態,票池有400張全程票
Server._init(400);


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn