Skip to main content

 路由器设置 > 新闻资讯 >

关于12306火车票销售的简单思考

2014-03-26 23:11 浏览:

昨天,大家在群里讨论了下12306的售票系统的算法问题,@北京-一苇渡江11同学和我提了要最小粒度锁,我给了一个相对简单的数据模型,不晓得可行性如何,欢迎大家拍砖。

 

我们假定有一趟列车K200,途径10个站点,我们分别用数字1,2...10来表示每个站点,这趟车我们假定只有10个座位,用A,B,C字母代替,其中规定,A座位只能在1号站点卖,但是终点随意,且到达终点被释放后可以给后面任意一个站点销售,B只能给2好站点卖,到终点后的策略和A座一个道理!以此类推!

 

模型如下:

1 2 3 4 5 6 7 8 9 10
A B C D E F G H I J

这个时候我们找个数据模型来表示余票信息,

模型需要标记的是车次,座位,起始站点,终点站,买卖标记,站内票(就是分配给该站,不得在其它站点卖),那么铁道部开始放票的初始化余票信息为:

车次 座位 起点站 终点站 买卖标记 站内票
K200 A 1 11 未卖
K200 B 2 11 未卖
K200 C 3 11 未卖
K200 D 4 11 未卖
K200 E 5 11 未卖
K200 F 6 11 未卖
K200 G 7 11 未卖
K200 H 8 11 未卖
K200 I 9 11 未卖
K200 J 10 11 未卖

现在我们假定有个人买一张从1站点到4站点的人,现在1号站点没票,四号站点有了两张票,其中下车的人的票用字母A1表示,但是因为后面的5,6,7,8,9,10号站点都可以卖票A1,所以实际上现在4以后的站点都变成了有两张票,我们的表格数据变成如下:

车次 座位 起点站 终点站 买卖标记 站内票
K200 A 1 4 已卖
K200 A 4 11 未卖
K200 B 2 11 未卖
K200 C 3 11 未卖
K200 D 4 11 未卖
K200 E 5 11 未卖
K200 F 6 11 未卖
K200 G 7 11 未卖
K200 H 8 11 未卖
K200 I 9 11 未卖
K200 J 10 11 未卖

那现在从上面的表格看出,1号站点已经没有票了,一个站点的余票信息是,如果非站内票,那么起始站点只要小于等于本站就行,如果站内票,则起始站点必须等于本站!所以可以看到2,3是还有一张票,4-10有两张票!

如果现在有个用户购买了6-8的票,一般是站内票优先,因为只能在该站卖,所以F票卖出,在8下车后变成了F1,这个时候8和9和10都有三张票。那要是再来一个用户需要买6-8的票,这个时候只能出A1的票,这样A座位就变成在4-6可以卖,8-10也可以卖!数据变成了如下:

车次 座位 起点站 终点站 买卖标记 站内票
K200 A 1 4 已卖
K200 A 4 6 未卖
K200 A 6 8 已卖
K200 A 8 11 未卖
K200 B 2 11 未卖
K200 C 3 11 未卖
K200 D 4 11 未卖
K200 E 5 11 未卖
K200 F 6 8 已卖
K200 F 8 11 未卖
K200 G 7 11 未卖
K200 H 8 11 未卖
K200 I 9 11 未卖
K200 J 10 11 未卖

当然还有一部分票可以卖,就是各个起点站之前的这部分票,可以看做短途票。下面的这部分票务购买和上面的逻辑一样!

车次 座位 起点站 终点站 买卖标记 站内票
K200 B 1 2 未卖
K200 C 1 3 未卖
K200 D 1 4 未卖
K200 E 1 5 未卖
K200 F 1 6 未卖
K200 G 1 7 未卖
K200 H 1 8 未卖
K200 I 1 9 未卖
K200 J 1 10 未卖

以上就是个人的粗略想法,欢迎大家拍砖!