【发布时间】:2012-12-22 03:57:12
【问题描述】:
我有一个巨大的数据库表,其中有 n 个整数间隔(例如 {1-5}、{4-16}、{6434-114343}),我需要找出 哪个间隔相互重叠。有很多similar questions on SO,但不同的是我需要分别为每个区间返回重叠区间的集合。
------------------ A -------------------
------ B ------- ----- D -----
--------- C ---------
对于本例,输出为A:{B,C,D} B:{A,C} C:{A,B} D:{A}
最坏的情况是,所有区间可能相互重叠,产生大小为 O(n2) 的输出。这并不比简单的解决方案更好(比较每对间隔)。然而,在实践中,我知道我的间隔很少会与其他间隔重叠,而且当它们重叠时,最多只有 5 个其他间隔。
鉴于此信息,我应该如何解决问题? (最理想的情况是,我想要一个 SQL 查询解决方案,因为数据在数据库中,但我认为只有常规的算法解决方案是可能的。)
【问题讨论】:
-
也许您应该在这种情况下指定“巨大”的含义。数千?百万?数十亿?如果确实存在纯 SQL 解决方案(我有疑问),您可能想告诉我们数据是如何存储在数据库中的,例如例如,您是否有单独的列用于范围名称/ID、间隔的开始和结束,或者将开始和结束存储为字符串值“x-y”。了解数值的范围也可能很有趣,例如预期的最小/最大间隔开始/结束是多少?
-
@Mecki:在这种情况下,“巨大”意味着 n=100,000。在数据库中,每个区间都有一个唯一的主键整数值、一个起始整数以及一个结束整数。数字范围从 0 到 4*10^9。
标签: algorithm intervals overlap