【本文来自《在外行看来,铁路自主选座非常容易实现,但懂行的程序员才知道这根本做不到》评论区,标题为小编添加】
你把问题想复杂了。下面几个需求,12306是不需要实现的。
1. 把几个座位的不同段行程合成一个完整的全程行程。
(相关资料图)
2.买一张票包含两个及以上不连续行程。
3.一张票包含两种或以上席位级别。
抛除这几个问题后,其实基本模型比较简单:
一列车座位(铺位)总数,乘降站数。构成了一个基本矩阵,行对应座位,列对应乘降区间。比如,一列500个席位的列车,有二十个站,那么就是十九个乘降区间。这就得到一个500*19的矩阵,每个元素有三个状态:空,锁,占。
那么卖票就是对这9500个元素的操作。每次操作的元素都是同一行(座位)的连续若干元素。
这不就是C语言基本内存分配模型么?一毛一样。一次分配若干长度的一段连续内存,分配成功返回首地址,不成功返回零…
中间不断做统计,统计各区间间存在的对应内存段的数量。这就是对外显示的可购票量。
购票请求经排队后,一个个来,成功就返回成功,失败就返回失败。反正看到显示有票并不保证能买到。
回到选座问题上来。统计区间可售票数的时候,分abcdf位置分别统计,要哪个位置的座就先从这个位置的列表中找一个,没有就找其他表里。哪个位置都没有就是查找失败,没票了。
12306的难度主要在于并发量大,请求分流与排队系统。至于核心分票段模型,别把它想得太复杂了。你们所认为的复杂性,不过是是那三个“不需要实现的问题”带来的。