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
6753 次点击
所在节点    编程
62 条回复
narfnas
2020-01-22 18:21:40 +08:00
难在开票时间点要接收大量用户的抢票,还有抢票软件的。
Raynard
2020-01-22 18:24:27 +08:00
推倒重建,会简单很多吧,相比当年
okjb
2020-01-22 18:28:24 +08:00
你这逻辑,上万辆车都不够你用🤣
shiran3f
2020-01-22 18:43:03 +08:00
唉,程序员不懂业务就是这么来的,脱离实际一个人在那边瞎猜,我手下的小弟不知道被我打脸多少次了,不要自己猜猜猜!这本质和键盘侠没区别。
andylsr
2020-01-22 19:16:34 +08:00
开一万个客户端跑下你的代码试试?
lance6716
2020-01-22 19:19:20 +08:00
宁这个没法并发?
xujinkai
2020-01-22 21:10:07 +08:00
看来 12306 后台也就百来行代码(滑稽
Helsing
2020-01-22 23:20:47 +08:00
优秀
Eleutherios
2020-01-23 00:06:43 +08:00
“这是个出票逻辑,其他方面没考虑那么多,讨论逻辑方面,不是要做个 12306”

这句话笑死我了。
litmxs
2020-01-23 01:23:56 +08:00
讨论就好好讨论,上面一些阴阳怪气的,自己也说不出个所以然,就在那嘲讽
daimubai
2020-01-23 01:35:27 +08:00
单就最后一句只考虑出票逻辑,这玩意还用单独开个贴?会加减法都知道,只考虑出票逻辑有讨论的意义吗?最次也得有个并发吧,有个实时同步检测吧
ThirdFlame
2020-01-23 08:53:08 +08:00
假设此车 起点为'南通' 终点为'深圳东'。 没有任何限售限制。全列 1000 个座位(暂不考虑卧铺,全部为普通座位。)
如果有人买了 '南通' -'深圳东' 那么南通之后所有车站的可售车票-1。
如果有人买了 '东莞东'-'深圳东',东莞东之前的所有车站到深圳东的车票-1。

如果有人买了 '南通' -'天柱山',那么天柱山之前车站到天柱山的车票-1,天柱山 到 天柱山之后的车站车票+1。
如果有人买了 '合肥'-‘天柱山’,那么合肥之前车站到 ‘合肥’、‘天柱山’区间车票-1. 天柱山到天柱山之后车票+1.

复杂度 请考虑一下。
所以要有专门的客票组织部门,指定合理的车票限售和预留。 还要计算上座位复用。
daboq
2020-01-23 09:24:36 +08:00
@ThirdFlame 大佬你看明白了没?复杂度 O(N),预留前面说了改标志位就行,卧铺无座加个字段
gamexg
2020-01-23 10:32:08 +08:00
这个方案并不方便,

感觉目前应该使用的这种方案:

a-e 的线路,预先分配好 a-e、a-b、a-c、a-d、b-c、b-d、b-e 等的票数,kv 数据库都够了,查询余票直接 get 对应的 key 就行,买票直接-1,然后后台再去分配座位号。

可以预先给 a-e 多分配票,卖票时后台根据售票信息动态拆分。
daboq
2020-01-23 10:45:40 +08:00
@gamexg 如果买了 a-e,那 a-b、a-c、a-d、b-c、b-d、b-e 都要减少一,如果是 30 个站点需要几百次修改,比这个方案复杂多了吧。
现在只需要查询 like ____00000__ 一步到位
gamexg
2020-01-23 10:53:51 +08:00
@daboq #35

根据业务经验及需求来预先分配,这样操作的:
比如共 3000 张票,多给 a-e 分配些,分配 a-e 1000 张,
另外 2000 张拆分配到详细区间,例如一张票可以拆分为 a-c、c-e 两个区间,放票时就固定拆分好。
查余票和买票时就比较简单了。

可以后台检查区间票,发现那个区间票低于预期值,可以决定是否后台拆分 a-e 的补区间票。

大体是这个意思,这个比较符合目前的区间无票,始发到终点的票却能够买到的情况。
gamexg
2020-01-23 11:03:35 +08:00
票池数据库大概这样:

key 是 线路-日期-车次-上车站点-下车站点-座位类型 ,value 就是座位数量。

买票操作就是直接对这行记录 -1,然后后台再分配座位号。


座位号可以用一个表保存,和票池对应,票池填充票时就生成座位表,每张票池的票对应一个座位记录。
大概这些字段:线路、日期、车次、上车站点、下车站点、座位类型、是否已使用、座位号

分配座位号时直接查找未使用的作为即可。
across
2020-01-23 11:23:27 +08:00
点开果然是新注册的 s b 小号,故意带节奏的
SjwNo1
2020-01-23 11:29:25 +08:00
别理了 你们理不明白的
est
2020-01-23 11:31:12 +08:00
反对 LZ 的也没提出反对的理由,就一个劲的喷。。。支持 LZ。我也觉得没多难。实际上 12306 最大的瓶颈就是查询。阿里云的解决办法就是上大内存机器。可以搜一下 zhihu 问答。

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

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

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

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

© 2021 V2EX