关于12306火车票销售的简单思考
2014-03-26 15:13
183 查看
昨天,大家在群里讨论了下12306的售票系统的算法问题,@北京-一苇渡江11同学和我提了要最小粒度锁,我给了一个相对简单的数据模型,不晓得可行性如何,欢迎大家拍砖。
我们假定有一趟列车K200,途径10个站点,我们分别用数字1,2...10来表示每个站点,这趟车我们假定只有10个座位,用A,B,C字母代替,其中规定,A座位只能在1号站点卖,但是终点随意,且到达终点被释放后可以给后面任意一个站点销售,B只能给2好站点卖,到终点后的策略和A座一个道理!以此类推!
模型如下:
这个时候我们找个数据模型来表示余票信息,
模型需要标记的是车次,座位,起始站点,终点站,买卖标记,站内票(就是分配给该站,不得在其它站点卖),那么铁道部开始放票的初始化余票信息为:
现在我们假定有个人买一张从1站点到4站点的人,现在1号站点没票,四号站点有了两张票,其中下车的人的票用字母A1表示,但是因为后面的5,6,7,8,9,10号站点都可以卖票A1,所以实际上现在4以后的站点都变成了有两张票,我们的表格数据变成如下:
那现在从上面的表格看出,1号站点已经没有票了,一个站点的余票信息是,如果非站内票,那么起始站点只要小于等于本站就行,如果站内票,则起始站点必须等于本站!所以可以看到2,3是还有一张票,4-10有两张票!
如果现在有个用户购买了6-8的票,一般是站内票优先,因为只能在该站卖,所以F票卖出,在8下车后变成了F1,这个时候8和9和10都有三张票。那要是再来一个用户需要买6-8的票,这个时候只能出A1的票,这样A座位就变成在4-6可以卖,8-10也可以卖!数据变成了如下:
当然还有一部分票可以卖,就是各个起点站之前的这部分票,可以看做短途票。下面的这部分票务购买和上面的逻辑一样!
以上就是个人的粗略想法,欢迎大家拍砖!
我们假定有一趟列车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 | 未卖 | 是 |
车次 | 座位 | 起点站 | 终点站 | 买卖标记 | 站内票 |
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 | 未卖 | 是 |
如果现在有个用户购买了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 | 未卖 | 否 |
相关文章推荐
- 关于基础和软硬件配合的简单思考
- 关于Hard Code的思考 - 程序员的管理不能简单使用制度
- 关于异常的简单思考
- 关于软件防止破解的思考,如何避免简单的跳转指令型的验证方法,如何设置更复杂的验证方式。
- 关于C代码性能调优的简单思考
- 关于学习方向的一次简单思考
- 关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 关于Hard Code的思考 - 程序员的管理不能简单使用制度
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
- 关于JAVA中一些简单加密算法的思考
- 关于properties的简单思考
- 关于REST中做简单验证的思考
- 代码回顾:关于写代码时cout 和printf 输出16进制数的简单思考
- 关于逻辑回归(Logistic regression)模型的简单思考
- 关于异常的简单思考
- 关于软件防止破解的思考,如何避免简单的跳转指令型的验证方法,如何设置更复杂的验证方式。
- 关于中南大学数据结构/C++课设题目的一点思考(一·简单题)
- 关于Unity3D中deltaTime的简单分析到引发思考
- 关于DataSet与Strongly typed DataSet几点思考(原创)