--- [EMAIL PROTECTED] wrote:
>       What we have is as stated a union of times. So all I do is take the
> timeslices and generate a hash element for each time. I don't check to see
> if it is already there, but just set to one. Then I sort the hash down
> numerically and total where current minus previous equal 1.  Here is a shot:
> 
> use Data::Dumper;
> 
> my @timeslices = (
>     [4, 9],
>     [3, 6],
>     [2, 4],
>     [11,12],
>     [14,14],
>     [17,19]
> );
> 
> my %MyHashCounts = ();
> 
> for(my $MyId=0;$MyId<=$#timeslices;$MyId++){
>    for($MyId1=$timeslices[$MyId][0];$MyId1<=$timeslices[$MyId][1];$MyId1++)
> {
>       $MyHashCounts{$MyId1}=1;
>     }
>  }
> print Dumper(\@timeslices);
> print Dumper(\%MyHashCounts);
> 
> my $MyPrev = -10;
> my $MyTotal = 0;
> foreach my $MyKeys (sort {$a <=> $b} keys %MyHashCounts) {
>    printf "%3d ", $MyKeys;
>    $MyTotal++ if ( ($MyKeys - $MyPrev) == 1 );
>    $MyPrev = $MyKeys; 
>  }
> printf "\n";
> printf "Total: %4d\n", $MyTotal;
> 
> Output:
>   2   3   4   5   6   7   8   9  11  12  14  17  18  19
> Total:   10

Which is wrong, since the 14 sneaked in even though the
contribution of [14,14] should be zero.  Notice:

      0                 1                   2
      1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
>     |    [4,      | 9], | |
>     |  [3,    6], | | | | |
>     |[2,| 4], | | | | | | |
>     | | | | | | | | | |[11,
>     | | | | | | | | | | | 12],
>     | | | | | | | | | | | | |[14,
>     | | | | | | | | | | | | | 14],
>     | | | | | | | | | | | | | | | |[17, 
      | | | | | | | | | | | | | | | | | |19]
         X X X X X X X     X X         X X = 11

Looking at my algorithm, I can remove the use of the
hash.

The algorithm you are using is inferiour to the approach
I tried (even though BOTH our algorithms are wrong).  If
I start using numbers in the region of Unix timestamps,
(i.e. large) it is an impossible to satisfy memory/CPU hog.

The algorithm I use is pictorally:

     XXXXXXXXXXXXXXXXXXX
                                YYYYYYYYYYYYYYYYYYYYYYY
                     ZZZZZZZZZZZZZZZZZZZZZZ
     ^                          ^         ^
     start X         ^          start Y   end Z       ^
                     start Z                        end Y
                       ^
                       end X

Sorting results in the following events:

     ^start X
                     ^start Z
                       ^end X
                                ^start Y
                                          ^end Z
                                                       ^ end Y

And we can find the number of overlapping sections now:
ACTIVE
V
1    ^start X
12                   ^start Z
12                     ^end X
 23                             ^start Y
 2                                        ^end Z
  3                                                    ^ end Y

So, by sorting we can loop through, starting and stopping "active"
timeslots.  We need to do this in order, otherwise we will get
incorrect results.  I sort the second column to always get a start
event before a stop event.

Jonathan Paton

=====
$_=q|.,&@$$. ,.@$&@$. .&$$@. ,,$ ....!$_=$p.'&$@.',y'&$@' .,';for(/\S+/g){
!|.q| .$ .,@, ,$, .,.. @, ,$ ,,@ .,,.!++$.<22?${'y'.$_}=chr$.+64:[$$=${'y'
!|.q| ,@$@&.,. $$$&, ..@&&$,,, $., ..!.$_},$y.=($.=~/22\|26\|3(3\|7)/x?' '
!|.q|. @  ., ,.&,,, , .$..&. .,$  .,,!.$$:"\l$$")]};$y=~/ (.*)/;warn"$1\n"
!|.q|. $ .,. .,$$&&$...&., @.,.&@$@ .|,map{-$|--?$r:$p.=$_}split'!';eval$r

__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to