关于 12306 售票的一些思考研究

关于 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。

评论