12306 出票逻辑没那么难吧

2020-01-22 17:10:21 +08:00
 daboq

一辆车算 3000 张票
将每个站点都设置个标志位
0 为未出售 1 为已卖出
出 A-B 的票逻辑:
1.搜索有没有 A-B 标志位都为 0 的行 2.将该行 A-B 所有标志位设为 1

完全没难度啊,多一张票=多插入一行,大家看看这想法对不对
python 测试代码:

zhandian=['南通','如皋','泰州','江都','扬州','滁州北','蚌埠','合肥','庐江','桐城','安庆西','天柱山','太湖','南昌','吉安','信丰','龙川','河源','惠州','东莞东','深圳东']

#三千张票
tickets=[[0 for i in range(len(zhandian))] for x in range(3000)]
def by_ticket(start,end):
    start_index=zhandian.index(start)
    end_index=zhandian.index(end)
    if end_index<=start_index:
        # 站点输入错误
        return -3

    for t in tickets:
        if t[start_index:end_index+1]==[0 for i in range(end_index-start_index+1)]:
            t[start_index:end_index+1]=[1 for i in range(end_index-start_index+1)]
            print('买到座位号{}的票 位置详情:{}'.format(t[0],t))
            return t
    print('无票')
    return -1
6989 次点击
所在节点    编程
62 条回复
silencht
2020-01-23 12:47:41 +08:00
震惊! V 站出现大量图灵奖得主!
hyy1995
2020-01-23 13:28:40 +08:00
不愧是 V 站。我虽然说不出个所以然,但我不敢自大到“没觉得多难”,楼上几位要觉得自己有本事,可以去当 12306 CTO,我相信你们可以解决“12306 每次一到春节就抢不到票”的 bug。


另外,讨论就讨论,特意注册个小号,还憋了几天再发帖,至于吗。。。
firefox12
2020-01-23 13:28:45 +08:00
代码没问题, 但是就是结果未必是最优解。但是我也觉得可能就没有最优解。现在的规则也不是最优解。

但是业务 不是 O(n)

以 n 4000 个位子 m 30 站为例子, 你每次分票是需要扫描全数组的。
当然可以优化
但是扫描必须全表。

1 你需要扫描每个 n 的每个 m, 得出这个位子能不能出票
比如 有人要买 a-z,
n=0 a...z 都是空的 符合买的条件
n=1 a...m 是空的 但是 l 不是空的,其实是不符合条件

得出一个符合要求的还不行

其次 你还需要做最优解
1, 3, 4, 6 , 7 符合要求,谁是里面最优的?
a...z 是不用考虑的
如果是 m...t 的出票, 出在哪个位子上更好? 上中下铺需求?所以 高速的分票其实比这个复杂。


所以你描述的 O(n) 是不对的。
wangyzj
2020-01-23 13:59:49 +08:00
插眼收藏等撕逼
SlipStupig
2020-01-23 14:12:08 +08:00
你的代码确实可以完成简单售票,但是还是不能满足 12306 的变态需求,先说你这个代码一些问题吧:
1. 你这个设计车次是单向车次,实际情况一趟车会在起点<->终点反复开
2. 你从始发站开始卖票就一次性给卖完了,非始发站的用户上车怎么办?这样不是不能卖票而是成本比较高。
3. 还有一些情况是退改补,这个会影响整个票仓,结合你问题 2 的设计,就会出现火车上出现空座,但是别人也无法购买
4.团体票,团体票相当于批量确认且具有排他性,申请过后,会一次性占多个座位。
5. 票务类型座位不一致,不同等级的票务,座位数量是不一样的,你目前系统假设大家都是平等数量,谁优先抢占谁就有座位,实际情况并不是这样

目前只从票务角度上说,我觉得问题有这些,其它的风控和系统性能不再讨论范围内
wangxiaoaer
2020-01-23 14:45:06 +08:00
@ThirdFlame 楼主的意思每卖一张新增一条记录,不存在修改库存,但考虑到座位数有限,应该要限制这些记录的总条数不超。
iugo
2020-01-23 16:18:41 +08:00
难的不应该是最大收入吗?

说个简单的例子.

设有 3 个站点(A, B, C), 那么一个座位可能的收入是:

A-C, 3 元
A-B, 2 元
B-C, 1.5 元

然后现在有人买 B-C 的票, 如果立刻卖了, 将来没人买 A-B 但有人买 A-C 就亏了 1.5 元, 如果不卖等 A-C, 将来有人买 A-B 就亏了 0.5 元.

排队是最好的办法, 先收钱, 符合最大利益就出票, 不符合就等着. 直到开车前不能等了, 就按照目前的最大利益出票.
ThirdFlame
2020-01-23 16:27:52 +08:00
只考虑 买组织好的 一个座位 一条记录的票 ,这当然时间复杂度很低。 只需要遍历或者查询即可。
那这和库存减少 或者说 电影院的售票有何区别,没区别,静态的售票而已。

12306 难 不难在售出一个组织好的票。 而是一张票售出后 带来的其他票的调整和变化。
wysnylc
2020-01-23 17:41:19 +08:00
淘宝也不过就是个订单系统
whypool
2020-01-23 17:52:18 +08:00
大佬:不就是 crud 么,有啥难度?
hellov22ex
2020-01-23 18:08:32 +08:00
你是不是从来没有写过真正用于干活的代码?
12306 难的不是这个出票逻辑,而是让全国各地的代理、车站、个人准确的获取票,这个是最难的,出票逻辑是它的衍生。
假设北京到上海,票 3000 张,最高峰同时有 300 人退票、买票、刷新界面,这时候要保证他们如果下单买了,票是正确的,买到的票能上火车。

但是实际情况是,普通日子负载压力是 300,特殊日子负载压力是 500000。
hellov22ex
2020-01-23 18:09:36 +08:00
对了,我记得某一年有过负载数据的公布,你自己去看看,这种数据需要多少什么配置的硬件才能搞定。
yanheqi
2020-01-23 20:24:29 +08:00
回形针做过这方面的节目 <iframe src="//player.bilibili.com/player.html?aid=42125169&cid=73947630&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>

https://www.bilibili.com/video/av42125169/
leokino
2020-01-24 01:27:01 +08:00
没那么简单。必须要确保在最大程度上出票方案全程无空位,并不是单纯的抢占问题。假设 ABC 三个站点,BC 卖掉了,AC 就没法卖,而 AC 可能有 900 元的价值,BC 只有 50 元。12306 的出票方案必须是尽量达到每辆车的空置率都是最低的。
ebony0319
2020-01-24 09:59:16 +08:00
我比较赞同你的想法,我一直以为登月就三步骤 1 打开舱门,2 下去,3 拍照宣布自己登月成功。这个只要超过一岁小孩谁不会哇。
petelin
2020-01-24 10:59:06 +08:00
有什么好讨论的 连业务是什么都不清楚

所有人都是在臆想解决自己脑子里的问题
mysunshinedreams
2020-01-28 22:04:08 +08:00
坐井观天?
AllenHua
2020-09-26 14:31:55 +08:00
@ThirdFlame #32 居然看到了天柱山 阁下莫非潜山人
AllenHua
2020-09-26 14:33:18 +08:00
@ThirdFlame #32 不好意思 看错了 楼主的站点数组里 就有 天柱山
ThirdFlame
2020-09-26 18:59:57 +08:00
@AllenHua 天柱山爬过,在合肥出差的时候 租车去的。风景不错,不用缆车的话 一天行程刚刚好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX