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

原文:flc.io/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
本帖由系统于 3小时前 自动加精
flc1125
讨论数量: 3
Mutoulee

不得不说,很精辟!

3周前 评论
  1. 站点表:包括全国所有的站点
  2. 车次表:包括站点与排序、开始与停靠时间
  3. 座位表:包括车次、车厢、座位
  4. 车票表:包括座位、开始站、结束站

提前多少天可以购票,只需要把所有的票提前生成就行

一个座位可以多人购买,只需要搜索的时候group一下就行

3周前 评论
flc1125 (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!