2014-01-21 3 views
6

Я использую код Set :: IntervalTree для сравнения двух наборов интервалов. Однако мне нужен дополнительный метод, который AFAIK в настоящее время не реализован в этом модуле.perl модуль для разделения/маска интервалов

Я хотел бы иметь метод, который разбивает или маскирует один интервал на два или более. Например:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <= [Original Interval A] 
      rrrrrrrrr     <= [Interval B to mask against A] 
xxxxxxxxxxx   xxxxxxxxxxxxxxxx <= [Resulting Intervals A1 and A2] 

Любые идеи, если это возможно с помощью существующего модуля Perl?

РЕДАКТИРОВАТЬ:

Для получения дополнительной информации, каждый интервал может иметь размер от 1 до 1 млрд (1E9) и в каждом интервале установить есть между 1 до 1 миллиона (1E6) интервалов.

+0

Ваш вопрос кажется неясным: W * a * интервал *? Вы работаете над * строками *? Пожалуйста, добавьте несколько пояснений о ваших целях, некоторых деталях, образцах или уже выполненных сценариях. –

+2

Вы видели 'Set :: IntSpan',' Set :: IntSpan :: Fast' и 'Set :: IntSpan :: Fast :: XS'? У них есть все основные операции: объединение, пересечение, разность –

ответ

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

+0

Круто спасибо. В чем разница между Set :: IntSpan и версиями Fast и Fast :: XS? – 719016

+1

Я не смотрел Fast, но Fast :: XS имеет модуль C с ним, который вы должны скомпилировать для установки. Я предполагаю, что это намного быстрее, если вам это понадобится. –

+0

Хорошо, я начну с дефолта, посмотрю, какую производительность я получу, и попробую другие, если он слишком медленный. – 719016

Смежные вопросы