我有一个大约5000个整数范围的列表(例如30-50,45-100等),我需要将其放入“排序顺序”。此订单需要基于哪些列表项是其他项的范围子集。例如,10-12将是2-14的范围子集。如果list(1).low_value> = list(2).low_value和list(1).upper_value< = list(2).upper_value则list(1)是list(2)的子集。更复杂的是,一些列表项将是许多列表项的子集。
我最终需要创建一个有序列表,以便较低索引的列表项始终是列表中跟随它的任何项目的子集或不相关(例如,范围1-2和3-4)。
谢谢, 标记
答案 0 :(得分:1)
我的第一反应是它听起来像topological sort,其中范围被视为图中的节点,并且边缘被认为存在于范围A到范围B iff A是B的子范围。 / p>
我假设你的意思是输出列表的条件是如果A出现在B之前,那么B不是A的严格子集(但是如果A = B,A和B是不相交的,或者A和B则没关系重叠而没有一个是另一个的子范围。)
如果范围B(B.upper_value - B.low_value
)的宽度至少是范围A的宽度,则B不能是A的严格子范围。因此,通过增加范围的宽度来对列表进行排序就足够了。这可以通过计算宽度然后进行基数排序以线性时间(假设固定大小的整数)来完成。