作者: 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)
我们