关于 12306 售票的一些思考研究 
                                                    
                        
                    
                    
  
                    
                    声明:本内容不一定是官方实际应用情况,仅为个人思考研究的方案。
问题:
买过票的都知道,乘客可以选车次的某站到某站,那意味着这期间的站点,该座位是不可售的。
那么,12306 是如何计算这个座位的售票情况的呢?
分析:
我随便找了个深圳前往北京的车次 G82,以下是它的基本信息:


我们在模拟几位乘客购票后的数据:

如图:1列-1A座位,因乘客1、乘客2把深圳北到驻马店西站的座位给占了,那意味着乘客三,如果想买,只能购买郑州东站到北京西段的座位。
那我们在换一种形式来体现 1列-1A座位的售票情况:

在仔细看看,这不就是妥妥的二进制嘛。
我们把 1列-1A座位的售票情况,转换成二进制,以及对应的十进制,就是:

那么刚开票时候的可售情况是怎么表示呢?

是不是足够清晰了!!
结论:
好,那我们在结合二进制运算的视角来看看这个问题。
- 刚开票的时候,可售站数是 2 ^ 所有站数 - 1,比如这个车次,就是2 ^ 10 - 1 = 1023,我们用这个数代表可售情况。
- 乘客1购票后,乘客占的坑位是 15,怎么算的?多个站之间位运算就好,比如2 ^ 0 + 2 ^ 1 + 2 ^ 2 + 2 ^ 3 = 15,我们用这个数代表乘客1占的坑位。
- 那乘客2此时如何想买票,怎么知道它能买哪些呢?其实就是图中空白区域。我们用 1023 ^ 15 = 1008计算即可。
- 乘客2购票后,可售就变成了:1008 ^ 48 = 960,也可以用1023 ^ 15 ^ 48 = 960计算。
- ……

推广:我写的一个关于 Go 框架 Kratos 的组件库:github.com/go-kratos-ecosystem/com... , 欢迎 Star。
本作品采用《CC 协议》,转载必须注明作者和本文链接
                                
                                
                                    个人主页:flc.io
                                
                            
                        
                    
                      本帖由系统于 1年前 自动加精
            
                 
           
             
             
             
             
             
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
不得不说,很精辟!
提前多少天可以购票,只需要把所有的票提前生成就行
一个座位可以多人购买,只需要搜索的时候group一下就行
现在12306的票也是有缓存时间的。