Perl快速检查重叠间隔?

时间:2017-02-26 02:25:53

标签: perl range intervals

我试图找到间隔的重叠。我有一个1000到5000的间隔(例如给出一个)。这将在下面给出的间隔中进行检查。这个脚本确实有效但速度非常慢,需要检查数千个时间间隔。有没有办法让这更快?感谢

#!/usr/bin/perl
use warnings;
use strict;
use v5.16;
use List::MoreUtils qw/ any /;

my $start = 1000;
my $end   = 5000;

while ( my $line = <DATA> ) {
    chomp $line;
    my @element = split "\t", $line;
    my @checking_array = "";
    for my $checking_no ( $element[0] .. $element[1] ) {
        push @checking_array, $checking_no;
    }
    for my $value ( $start .. $end ) {
        if ( any { $_ eq $value } @checking_array ) {
            print "$start to $end found in $line\n";
            last;
        }
        else { next }
    }
}

__DATA__
780895  781139
3707570 3707794
13753925    13754168
2409582 2409790
6360880 6361084
8261045 8261250
4133539 4133772
7731897 7732188
8660252 8660539
12156253    12156504
9136875 9137168
16657849    16658107
5000    6000
4133539 4133772
7731897 7732188
8660252 8660539
4999    10000
12156253    12156504
3707570 3707794
13753925    13754168
2409582 2409790
6360880 6361084

输出:

1000 to 5000 found in 5000  6000
1000 to 5000 found in 4999  10000

2 个答案:

答案 0 :(得分:6)

你永远不需要在界限之间的数字!!!!只需检查边界。

         S---------E
 L-----H                      No overlap
      L-----H                 Overlap
           L-----H            Overlap
                L-----H       Overlap
                     L----H   No overlap
      L---------------H       Overlap

因此它们重叠,除非H E。

while ( my $line = <DATA> ) {
    chomp $line;
    my ($lo, $hi) = split "\t", $line;
    if ( $lo <= $end && $hi >= $start ) {
        print "$start to $end found in $line\n";
    }
}

答案 1 :(得分:3)

无需检查$start$end之间的每个值;您可以简单地比较两个范围的限制。我认为这段代码非常简单

#!/usr/bin/perl

use strict;
use warnings 'all';

my $start = 1000;
my $end   = 5000;

while ( my $line = <DATA> ) {

    my ($low, $high) = split ' ', $line;

    unless ( $high < $start or $low > $end ) {
        chomp $line;
        print qq{$start to $end found in "$line"\n};
    }
}

__DATA__
780895  781139
3707570 3707794
13753925    13754168
2409582 2409790
6360880 6361084
8261045 8261250
4133539 4133772
7731897 7732188
8660252 8660539
12156253    12156504
9136875 9137168
16657849    16658107
5000    6000
4133539 4133772
7731897 7732188
8660252 8660539
4999    10000
12156253    12156504
3707570 3707794
13753925    13754168
2409582 2409790
6360880 6361084

输出

1000 to 5000 found in "5000    6000"
1000 to 5000 found in "4999    10000"