关于 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 的组件库:https://github.com/go-kratos-ecosystem/components , 欢迎 Star。