算法:初探12306售票算法。
以G71列车为例,⾸先对车次站台进⾏占位编码(从1开始到最后⼀站递加)
对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座位标识可以⽤⼗⼋位长度的⼆进制字符串表⽰10000000000000000每⼀位代表⼀个站点,每天放票前初始化到下⾯的订票表中,数据如下余票根据座位标识中的0的个数决定最⼤余票数量
端午祝福语一句话订票表中的始发受限站点和终到受限站点可以灵活搭配(这个就可以实现限制站点发售)
限售渠道⼗进制 7 代表 1(车站)| 2(互联⽹)|4(电话)=7 即该票允许 车站, 互联⽹, 电话同时出售
那么还可以是 1|4 = 5 即该票只接受在车站和电话预定
扩展 8(代售点) 16 (⼿机端)
查询余票
如果我们要⽤互联⽹渠道查询⽇期为2016-06-11,始发站保定东站(3)到韶关站(15)的G71⼆等座F座位余票情况只需要执⾏如下sql(该SQL可以实现选座位和选车厢等功能)
select GUID,车次编码,车次类型,座位类型,车厢号码,座位编码,座位位置,车票版本号 from 订票表
where 座位标识=~((~坐标标识)|000111111111111000)
and 发车⽇期='2016-06-11'
and 车次编码='G71'
越发造句子and 始发受限车站=始发受限车站|000100000000000000
沈玉琳 芽芽and 终到受限车站=终到受限车站|000000000000001000
and 车次类型='⼆等座'
and 座位位置='F'and 受限渠道=2|受限渠道order by 余票数量 asc ,车厢 asc --先卖余票少的,防⽌打乱更多的长途票
预定票
根据第⼆步中查询条件获取⼀条记录然后将车票状态改为锁定
待锁定成功后进⾏⽀付
update 订票表 set 座位标识=座位标识 | 000111111111111000,车票版本号=车票版本号+1,余票数量 = 余票数量-(15-3)
伍迪 哈里森where GUID = Md5(车次+座位编码+发车⽇期) and 座位标识=~((~坐标标识)|000111111111111000)--乐观锁
根据更新结果是否为1则可以判定购票成功
女主播柳岩⽀付成功后然后将保定到韶关的票保存到另外⼀张客户的车票表中
如果指定时间没有⽀付,那么直接调⽤退票sql
退票
获得该车次保定到韶关的票 (000111111111111000)与对应的票进⾏异或^运算,则即可回归票池⼦了
王昌龄选座
update 订票表 set 座位标识=座位标识 ^000111111111111000,余票数量 = 余票数量+(15-3),车票版本号=车票版本号+1 where GUID = Md5(车次+座位编码+发车⽇根据返回结果为1则标识退票成功
发布评论