Skip to main content

探索座位分配的奥秘

座位分配背景

当一家四口人出去玩在 12306 进行购票时,假定四个人都选择了商务座,你是想一家人被安排到各个不同的车厢还是在一个车厢不同座位还是一个车厢相邻座位?想都不用想,肯定是后者最好对不对。那如果要实现这个座位分配算法,却不是这么容易。

先放一张高铁商务座的座位分布图,复兴号商务座两排三座,一个车厢排除空座位,共 5 个可用座位,如下所示:

大家也可以去看下 12306 上实际购买复兴号高铁试试,一排三个座位,分别是 ACF。咱们系统都是严格按照原系统逻辑设计的。

座位分配难点

座位如果要想分配的合理,需要考虑的情况比较多,比如:

  • 单个车厢可能容纳不下购票乘车人数;
  • 单排座位可能容纳不下购票乘车人,需要根据不同座位类型拆成多排分配;
  • 单个车厢可能容纳的下购票乘车人,但没有相邻座位;
  • 选中座位类型车厢余量加一起都容纳不下购票乘车人的情况。

座位分配逻辑

考虑到种种情况,咱们的高铁座位分配算法流程如下,还是以商务座举例。

为了让咱们能更专注基本的座位分配算法,以下流程不包含购票人数大于等于三人(大于等于三人就要进行拆座位)以及在线选座等流程。

  • 如果购票人数为两人,购买同一车厢,座位优先检索两人相邻座位并排分配。
  • 假设当前正在检索的车厢不满足两人并排,就执行搜索全部满足两人并排的车厢。
  • 如果搜索了所有车厢还是没有两人并排做的座位,那么执行同车厢不相邻座位。
  • 如果所有车厢都是仅有一个座位,就开始执行最后降级操作,不同车厢分配。

这里生动形象的演示了几组用户购票对应的座位分配顺序,结合咱们流程查看理解更顺畅。

单一账号同时为两个乘车人购买车票,多个账号购票流程如下。

单一账号同时为两个以上乘车人购买车票,多个账号购票流程如下。

实际上的座位分配算法远比描述上要复杂的多,上面讲的是用户购买高铁座在没有人为选择座位的情况下逻辑。如果用户选择了座位后,算法又是不同的逻辑了。

考虑到大家的中心不需要放到这里,所以文章就没有详细描述算法的细节。感兴趣的同学可以通过 Debug 源代码的形式,掌握默认分配座位以及选座算法。