71 --- 70 --- 69-- --- 68 ------- --- 68 --- 67 --- 66 --- .. 0 -------------------------------------------------------------- #### sub probe { use integer; my( $aref, $lo, $hi, $limit, $istep ) = @_; my $step = ( $hi - $lo ) / $istep; { my $i = $lo; $i += $step while $i <= $hi and $aref->[ $i ] <= $limit; if( $i >= $hi ) { if( $aref->[ $hi ] == $limit ) { --$hi while $aref->[ $hi - 1 ] == $limit; return $hi; } $step /= 2; } else { $limit = $aref->[ $i ]; $lo = $hi - $step; ## Update: Swapped the order of this line and the next $hi = $i; $step = int( ( $hi - $lo ) / $istep ); # $istep was wrongly '10' } redo; } } #### my $ramping = 57000 - 9029; my $step = int( $ramping / 72 ); my $leftovers = $ramping - ( $step * 72 ); my $tiedObj = tie my @levels, 'Tie::Array::CountReads'; @levels = ( ( 68 ) x 9029, map( (( $_ ) x $step ), reverse 0 .. 71 ), (0) x $leftovers ); #### C:\test>junk8 Initial step size: 10 located 'file' 9695 after probing 318 files Initial step size: 11 located 'file' 10361 after probing 7 files Initial step size: 12 located 'file' 9029 after probing 475 files Initial step size: 13 located 'file' 10361 after probing 623 files Initial step size: 14 located 'file' 9695 after probing 505 files Initial step size: 15 located 'file' 9029 after probing 492 files Initial step size: 16 located 'file' 10361 after probing 332 files Initial step size: 17 located 'file' 9695 after probing 368 files Initial step size: 18 located 'file' 9029 after probing 476 files Initial step size: 19 located 'file' 10361 after probing 164 files Initial step size: 20 located 'file' 9695 after probing 306 files Initial step size: 21 located 'file' 10361 after probing 503 files Initial step size: 22 located 'file' 9695 after probing 673 files Initial step size: 23 located 'file' 9695 after probing 225 files Initial step size: 24 located 'file' 9029 after probing 475 files Initial step size: 25 located 'file' 9029 after probing 95 files Initial step size: 26 located 'file' 10361 after probing 608 files Initial step size: 27 located 'file' 10361 after probing 203 files Initial step size: 28 located 'file' 9695 after probing 489 files Initial step size: 29 located 'file' 9695 after probing 139 files Initial step size: 30 located 'file' 9029 after probing 475 files Initial step size: 31 located 'file' 9029 after probing 170 files Initial step size: 32 located 'file' 10361 after probing 335 files Initial step size: 33 located 'file' 10361 after probing 11 files Initial step size: 34 located 'file' 9695 after probing 371 files Initial step size: 35 located 'file' 9695 after probing 83 files Initial step size: 36 located 'file' 9029 after probing 479 files Initial step size: 37 located 'file' 9029 after probing 221 files Initial step size: 38 located 'file' 10361 after probing 143 files Initial step size: 39 located 'file' 9695 after probing 543 files Initial step size: 40 located 'file' 9695 after probing 284 files Initial step size: 41 located 'file' 9695 after probing 46 files Initial step size: 42 located 'file' 9029 after probing 481 files Initial step size: 43 located 'file' 9029 after probing 257 files Initial step size: 44 located 'file' 9029 after probing 47 files Initial step size: 45 located 'file' 9695 after probing 445 files Initial step size: 46 located 'file' 9695 after probing 229 files Initial step size: 47 located 'file' 9695 after probing 13 files Initial step size: 48 located 'file' 9029 after probing 479 files Initial step size: 49 located 'file' 9029 after probing 287 files Initial step size: 50 located 'file' 9029 after probing 95 files Initial step size: 51 located 'file' 9695 after probing 371 files Initial step size: 52 located 'file' 9695 after probing 182 files Initial step size: 53 located 'file' 9029 after probing 659 files Initial step size: 54 located 'file' 9029 after probing 479 files Initial step size: 55 located 'file' 9029 after probing 308 files Initial step size: 56 located 'file' 9029 after probing 137 files Initial step size: 57 located 'file' 9695 after probing 309 files Initial step size: 58 located 'file' 9695 after probing 139 files Initial step size: 59 located 'file' 9029 after probing 645 files Initial step size: 60 located 'file' 9029 after probing 475 files Initial step size: 61 located 'file' 9029 after probing 325 files Initial step size: 62 located 'file' 9029 after probing 175 files Initial step size: 63 located 'file' 9029 after probing 25 files Initial step size: 64 located 'file' 9695 after probing 110 files Initial step size: 65 located 'file' 9029 after probing 622 files Initial step size: 66 located 'file' 9029 after probing 479 files Initial step size: 67 located 'file' 9029 after probing 336 files Initial step size: 68 located 'file' 9029 after probing 204 files Initial step size: 69 located 'file' 9029 after probing 72 files Initial step size: 70 located 'file' 9695 after probing 89 files Initial step size: 71 located 'file' 9029 after probing 611 files Initial step size: 72 located 'file' 9029 after probing 479 files Initial step size: 73 located 'file' 9029 after probing 347 files Initial step size: 74 located 'file' 9029 after probing 227 files Initial step size: 75 located 'file' 9029 after probing 95 files Initial step size: 76 located 'file' 9695 after probing 59 files Initial step size: 77 located 'file' 9029 after probing 608 files Initial step size: 78 located 'file' 9029 after probing 478 files Initial step size: 79 located 'file' 9029 after probing 361 files Initial step size: 80 located 'file' 9029 after probing 244 files Initial step size: 81 located 'file' 9029 after probing 127 files Initial step size: 82 located 'file' 9029 after probing 23 files Initial step size: 83 located 'file' 9029 after probing 593 files Initial step size: 84 located 'file' 9029 after probing 481 files Initial step size: 85 located 'file' 9029 after probing 369 files Initial step size: 86 located 'file' 9029 after probing 257 files Initial step size: 87 located 'file' 9029 after probing 159 files Initial step size: 88 located 'file' 9029 after probing 47 files Initial step size: 89 located 'file' 9029 after probing 590 files Initial step size: 90 located 'file' 9029 after probing 485 files Initial step size: 91 located 'file' 9029 after probing 380 files Initial step size: 92 located 'file' 9029 after probing 275 files Initial step size: 93 located 'file' 9029 after probing 170 files Initial step size: 94 located 'file' 9029 after probing 80 files Initial step size: 95 located 'file' 9029 after probing 575 files Initial step size: 96 located 'file' 9029 after probing 479 files Initial step size: 97 located 'file' 9029 after probing 383 files Initial step size: 98 located 'file' 9029 after probing 287 files Initial step size: 99 located 'file' 9029 after probing 191 files Initial step size: 100 located 'file' 9029 after probing 95 files #### Initial step size: 100 located 'file' 9029 after probing 95 files Initial step size: 110 located 'file' 9029 after probing 317 files Initial step size: 120 located 'file' 9029 after probing 475 files Initial step size: 130 located 'file' 9029 after probing 194 files Initial step size: 140 located 'file' 9029 after probing 359 files Initial step size: 150 located 'file' 9029 after probing 95 files Initial step size: 160 located 'file' 9029 after probing 257 files Initial step size: 170 located 'file' 9029 after probing 47 files Initial step size: 180 located 'file' 9029 after probing 168 files Initial step size: 190 located 'file' 9029 after probing 275 files Initial step size: 200 located 'file' 9029 after probing 95 files Initial step size: 210 located 'file' 9029 after probing 223 files Initial step size: 220 located 'file' 9029 after probing 75 files Initial step size: 230 located 'file' 9029 after probing 151 files Initial step size: 240 located 'file' 9029 after probing 257 files Initial step size: 250 located 'file' 9029 after probing 95 files Initial step size: 260 located 'file' 9029 after probing 215 files Initial step size: 270 located 'file' 9029 after probing 91 files Initial step size: 280 located 'file' 9029 after probing 155 files Initial step size: 290 located 'file' 9029 after probing 234 files Initial step size: 300 located 'file' 9029 after probing 95 files Initial step size: 310 located 'file' 9029 after probing 175 files Initial step size: 320 located 'file' 9029 after probing 104 files Initial step size: 330 located 'file' 9029 after probing 144 files Initial step size: 340 located 'file' 9029 after probing 215 files Initial step size: 350 located 'file' 9029 after probing 103 files Initial step size: 360 located 'file' 9029 after probing 197 files Initial step size: 370 located 'file' 9029 after probing 120 files Initial step size: 380 located 'file' 9029 after probing 125 files Initial step size: 390 located 'file' 9029 after probing 89 files Initial step size: 400 located 'file' 9029 after probing 127 files Initial step size: 410 located 'file' 9029 after probing 75 files Initial step size: 420 located 'file' 9029 after probing 87 files Initial step size: 430 located 'file' 9029 after probing 152 files Initial step size: 440 located 'file' 9029 after probing 75 files Initial step size: 450 located 'file' 9029 after probing 119 files Initial step size: 460 located 'file' 9029 after probing 151 files Initial step size: 470 located 'file' 9029 after probing 125 files Initial step size: 480 located 'file' 9029 after probing 138 files Initial step size: 490 located 'file' 9029 after probing 101 files Initial step size: 500 located 'file' 9029 after probing 95 files Initial step size: 510 located 'file' 9029 after probing 159 files Initial step size: 520 located 'file' 9029 after probing 105 files Initial step size: 530 located 'file' 9029 after probing 155 files Initial step size: 540 located 'file' 9029 after probing 91 files Initial step size: 550 located 'file' 9029 after probing 127 files Initial step size: 560 located 'file' 9029 after probing 155 files Initial step size: 570 located 'file' 9029 after probing 175 files Initial step size: 580 located 'file' 9029 after probing 182 files Initial step size: 590 located 'file' 9029 after probing 190 files Initial step size: 600 located 'file' 9029 after probing 190 files Initial step size: 610 located 'file' 9029 after probing 187 files Initial step size: 620 located 'file' 9029 after probing 175 files Initial step size: 630 located 'file' 9029 after probing 166 files Initial step size: 640 located 'file' 9029 after probing 155 files Initial step size: 650 located 'file' 9029 after probing 127 files Initial step size: 660 located 'file' 9029 after probing 110 files Initial step size: 670 located 'file' 9029 after probing 177 files Initial step size: 680 located 'file' 9029 after probing 131 files Initial step size: 690 located 'file' 9029 after probing 188 files Initial step size: 700 located 'file' 9029 after probing 159 files Initial step size: 710 located 'file' 9029 after probing 128 files Initial step size: 720 located 'file' 9029 after probing 175 files Initial step size: 730 located 'file' 9029 after probing 139 files Initial step size: 740 located 'file' 9029 after probing 179 files Initial step size: 750 located 'file' 9029 after probing 171 files Initial step size: 760 located 'file' 9029 after probing 200 files Initial step size: 770 located 'file' 9029 after probing 200 files Initial step size: 780 located 'file' 9029 after probing 151 files Initial step size: 790 located 'file' 9029 after probing 173 files Initial step size: 800 located 'file' 9029 after probing 191 files Initial step size: 810 located 'file' 9029 after probing 134 files Initial step size: 820 located 'file' 9029 after probing 145 files Initial step size: 830 located 'file' 9029 after probing 152 files Initial step size: 840 located 'file' 9029 after probing 155 files Initial step size: 850 located 'file' 9029 after probing 155 files Initial step size: 860 located 'file' 9029 after probing 154 files Initial step size: 870 located 'file' 9029 after probing 149 files Initial step size: 880 located 'file' 9029 after probing 205 files Initial step size: 890 located 'file' 9029 after probing 205 files Initial step size: 900 located 'file' 9029 after probing 191 files Initial step size: 910 located 'file' 9029 after probing 173 files Initial step size: 920 located 'file' 9029 after probing 213 files Initial step size: 930 located 'file' 9029 after probing 213 files Initial step size: 940 located 'file' 9029 after probing 186 files Initial step size: 950 located 'file' 9029 after probing 215 files Initial step size: 960 located 'file' 9029 after probing 215 files Initial step size: 970 located 'file' 9029 after probing 179 files Initial step size: 980 located 'file' 9029 after probing 179 files Initial step size: 990 located 'file' 9029 after probing 197 files Initial step size: 1000 located 'file' 9029 after probing 209 files #### #! perl -slw use strict; package Tie::Array::CountReads; use Tie::Array; our @ISA = 'Tie::Array'; my %readCounts; sub TIEARRAY{ my $self = bless [], $_[ 0 ]; $readCounts{ $self } = 0; return $self; } sub FETCH { ++$readCounts{ $_[0] }; $_[0]->[ $_[1] ] } sub FETCHSIZE{ scalar @{ $_[0] } } sub STORESIZE{ $#{ $_[0] } = $_[1] } sub STORE{ $_[0]->[ $_[ 1 ] ] = $_[ 2 ] } sub readCount{ $readCounts{ $_[ 0 ] } } sub resetCount{ $readCounts{ $_[0] } = 0 } package main; my $ramping = 57000 - 9029; my $step = int( $ramping / 72 ); my $leftovers = $ramping - ( $step * 72 ); my $tiedObj = tie my @levels, 'Tie::Array::CountReads'; @levels = ( ( 68 ) x 9029, map( (( $_ ) x $step ), reverse 0 .. 71 ), (0) x $leftovers ); #print scalar @levels; sub probe { use integer; my( $aref, $lo, $hi, $limit, $istep ) = @_; my $step = ( $hi - $lo ) / $istep; { my $i = $lo; $i += $step while $i <= $hi and $aref->[ $i ] <= $limit; if( $i >= $hi ) { if( $aref->[ $hi ] == $limit ) { --$hi while $aref->[ $hi - 1 ] == $limit; return $hi; } $step /= 2; } else { $limit = $aref->[ $i ]; $lo = $hi - $step; ## Update: Swapped the order of this line and the next $hi = $i; $step = int( ( $hi - $lo ) / $istep ); # $istep was wrongly '10' } redo; } } for my $istep ( 10 .. 100 ) { printf "Initial step size: $istep located 'file' %d after probing %d files\n", probe( \@levels, 0, $#levels, 68, $istep ), $tiedObj->readCount; $tiedObj->resetCount; } for my $istep ( map $_ *10, 10 .. 100 ) { printf "Initial step size: $istep located 'file' %d after probing %d files\n", probe( \@levels, 0, $#levels, 68, $istep ), $tiedObj->readCount; $tiedObj->resetCount; }