Perl - 确定几个数值范围的交集

时间:2013-05-02 15:28:15

标签: perl range overlap

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

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

Intersection of ranges: (15..30) 

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

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:5)

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

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


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

  1. 创建一个空结果集。
  2. 为每个范围创建一个集合。
  3. 对于列表中的每个集合,
    1. 对于列表中的每个后续设置,
      1. 找到这两组的交集。
      2. 找到结果集和此交集的并集。这是新的结果集。
  4. 枚举结果集的元素。

答案 1 :(得分:0)

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