3

我希望能够加载正整数范围的长列表并创建一个新的“摘要”范围列表,该列表是每对范围的交集的并集。而且,我想在 Perl 中做到这一点。例如:

Sample ranges: (1..30) (45..90) (15..34) (92..100)

Intersection of ranges: (15..30) 

我能想到的唯一方法是使用一堆嵌套if语句来确定样本 A、样本 B、样本 C 等的起点,并以这种方式找出重叠,但不可能用数百个样本来做到这一点,每个都包含许多范围。

任何建议表示赞赏!

4

2 回答 2

5

当您需要做某事时,您应该做的第一件事是查看CPAN,看看如果有人已经为您解决了您的问题,可以使用哪些工具。

Set::IntSpanSet ::IntRange位于 CPAN 上“set”结果的第一页。


你想要的是每对范围的交集的并集,所以算法如下:

  1. 创建一个空的结果集。
  2. 为每个范围创建一个集合。
  3. 对于列表中的每个集合,
    1. 对于列表中的每个后面的集合,
      1. 找到这两组的交集。
      2. 找到结果集和这个交集的并集。这是新的结果集。
  4. 枚举结果集的元素。
于 2013-05-02T15:36:38.207 回答
0

我没有要共享的代码,但我会将每个范围扩展为哈希,或者使用 Set 模块,然后对集合使用交集运算。

于 2013-05-02T15:41:27.697 回答