Perl模块用于分割/遮蔽区间。

6
我正在使用Set::IntervalTree代码来比较两组区间。然而,我需要一个额外的方法,目前在这个模块中好像还没有实现。
我希望有一个将一个区间分为两个或更多部分的方法,例如:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    <= [Original Interval A]
           rrrrrrrrr                    <= [Interval B to mask against A]
xxxxxxxxxxx         xxxxxxxxxxxxxxxx    <= [Resulting Intervals A1 and A2]

请问现有的Perl模块是否支持此功能?

编辑:

更多信息:每个区间的大小可以从1到10亿(1E9),每个区间集中都有1到100万(1E6)个区间。


你的问题似乎不太清楚:什么是“间隔”?你是在处理字符串吗?请添加一些关于你的目标、一些细节、样例或已经完成的脚本的解释。 - F. Hauri - Give Up GitHub
2
你看过 Set::IntSpanSet::IntSpan::FastSet::IntSpan::Fast::XS 吗?它们都有基本的集合操作:并集、交集、差集。 - user2404501
1个回答

3

Set::IntSpan可以满足你的要求,假设你需要整数边界来表示你的区间:

#!/usr/bin/perl -w
use strict;
use Set::IntSpan;

my $A    = new   Set::IntSpan '1-1000000000';
my $B    = new   Set::IntSpan '3-5,10-20,100-200,1000-2000';
my $C    = diff $A $B;

print $C;

返回

1-2、6-9、21-99、201-999、2001-1000000000


很酷,谢谢。Set::IntSpan与其Fast和Fast::XS版本有什么区别? - 719016
1
我还没有研究过Fast,但是Fast::XS带有一个C模块,需要编译才能安装。如果你需要更快的速度,我相信它会更快。 - Jeff Snider
好的,我会先使用默认选项,看看性能如何,如果太慢的话再尝试其他选项。 - 719016
1
如果您认为这个回答解决了您的问题,能否在赏金过期之前接受这个答案呢?如果没有,让我知道缺少什么。 - Jeff Snider
谢谢,运行得很好。我不知道 diff $A $B 的表示方法,我更习惯于使用 $A->diff($B) - 719016

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接