火车票余票问题的算法解析

作者: Phill King

原创文章,转载请注明出处。

我们每次购买火车票,在查询的时候都可以及时的看到余票数。这个余票数是怎么计算出来的?有没有好的算法可以很快的计算出余票数目。本文对这个问题做了详细的分析,并给出了具体的代码。

声明:

本文详细分析了火车票的余票的算法,不考虑现实中一列火车包含不同等级座位和站票,以及预分配等情况,采用一个简化的模型来做基本分析。最后用一个高效率的算法来获取所有站点的余票数。

本文和12306无关。

-----------------------------------------------------------------------------------------------------

火车票余票问题的描述:

假设有一列火车,一共有M个座位,沿途经过S个站点。在出售一定数量的车票后,求该火车在沿途各站点的余票数。

首先我们对购票的情况和余票的关系做一个分析。

以M=5个座位, S=6站 为例

 

该表中的列代表所购票对应的站点段,一共有6站,对应的站点段数为5. 用户购买某张票如(3-6)站,即意味者占用了(3-4),(4-5),(5-6)的站点段。

该表中的行代表了座位号,对应购票时的座位。下文的总票数即为总的座位数。

对于(1-2)段来说,余票数就是总票数减去被占用的座位数。 示例中是 5-2 = 3;

对于(1-3)段来说,余票数就是总票数减去  (1-2) ∪ (2-3)的占用座位数。 示例中是 5-3 = 2;

对于(2-4)段来说,  余票数就是总票数减去  (2-3) ∪ (3-4)的占用座位数。  示例中是 5-4 = 1;

...

对应的余票表:

(行表头对应出发站,列表头对应抵达站)

 

因为余票即为总票数减去占用座位数,下面我们用更直观的占用座位表格来分析。

座位占用表: ( Si代表 从i到i+1站的座位占用集合)

我们可以看到对于某两站的座位占用集合有相应的规律,如

S(1-3) = S1  S2; 

S(2-5) = S2 ∪ S3 U S4

S(i-j) = Si ∪ S(i+1) ... ∪ S(j-1)

我们

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值