Advertisement
fruffl

binarySearch()

Sep 22nd, 2015
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.68 KB | None | 0 0
  1.  
  2.     class Test implements IteratorAggregate, Countable
  3.     {
  4.         protected       $__data         = [];
  5.  
  6.         function __construct(array $__data = [])
  7.         {
  8.             reset($__data);
  9.             foreach($__data as $v)
  10.                 $this->__data[] = $v;
  11.         }
  12.  
  13.         function binarySearch($__int32, $__index = NULL, $__length = NULL)
  14.         {
  15.             NULL !== $__index   ?: $__index = 0x00;
  16.             NULL !== $__length  ?: $__length    = $this->count() - $__index;
  17.            
  18.             if($__index + $__length > $this->count())
  19.             {
  20.                 var_dump('out of range');
  21.                 return FALSE;
  22.             }
  23.        
  24.             $t = $this->__data;
  25.             $l = $__index;
  26.             $r = $__index + $__length - 1;
  27.             echo __FUNCTION__.":$__int32 from index:$l to index:$r";
  28.            
  29.             do
  30.             {
  31.                 $mid = intval(($l + $r + ($r % 0x02))/0x02);
  32.                 //$mid = intval(($r+$l)/0x02);
  33.                
  34.                 if($t[$mid] === $__int32)
  35.                 {
  36.                     echo " | found $__int32@index $mid";
  37.                     return intval(floor($mid));
  38.                 }
  39.                 else
  40.                 if($t[$mid] > $__int32)
  41.                 {
  42.                     echo " | mid:$mid@ $t[$mid]>$__int32";
  43.                     $r = $mid - 0x01;
  44.                 }
  45.                 else
  46.                 if($t[$mid] < $__int32)
  47.                 {
  48.                     echo " | mid:$mid@ $t[$mid]<$__int32";
  49.                     $l = $mid + 0x01;
  50.                 }
  51.             }
  52.             while($l <= $r && $mid >= 0x00);
  53.            
  54.             return FALSE;
  55.         }
  56.     }
  57.  
  58.  
  59.             $B = new Test(range(0,9));
  60.             foreach($B as $v)
  61.             {
  62.                 $r = $B->binarySearch($v, 0, 10);
  63.                 $t = getType($r);
  64.                 if($r === false)
  65.                     $r = PHP_EOL."\tfalse";
  66.                 print ' | ('.$t.') ';
  67.                 print $r.PHP_EOL;
  68.             }
  69.             var_dump($B);
  70.  
  71. binarySearch:0 from index:0 to index:9 | mid:5@ 5>0 | mid:2@ 2>0 | mid:1@ 1>0 | found 0@index 0 | (integer) 0
  72. binarySearch:1 from index:0 to index:9 | mid:5@ 5>1 | mid:2@ 2>1 | found 1@index 1 | (integer) 1
  73. binarySearch:2 from index:0 to index:9 | mid:5@ 5>2 | found 2@index 2 | (integer) 2
  74. binarySearch:3 from index:0 to index:9 | mid:5@ 5>3 | mid:2@ 2<3 | found 3@index 3 | (integer) 3
  75. binarySearch:4 from index:0 to index:9 | mid:5@ 5>4 | mid:2@ 2<4 | mid:3@ 3<4 | found 4@index 4 | (integer) 4
  76. binarySearch:5 from index:0 to index:9 | found 5@index 5 | (integer) 5
  77. binarySearch:6 from index:0 to index:9 | mid:5@ 5<6 | mid:8@ 8>6 | mid:7@ 7>6 | found 6@index 6 | (integer) 6
  78. binarySearch:7 from index:0 to index:9 | mid:5@ 5<7 | mid:8@ 8>7 | found 7@index 7 | (integer) 7
  79. binarySearch:8 from index:0 to index:9 | mid:5@ 5<8 | found 8@index 8 | (integer) 8
  80. binarySearch:9 from index:0 to index:9 | mid:5@ 5<9 | mid:8@ 8<9 | found 9@index 9 | (integer) 9
  81. object(ILLI\Core\Std\ArrayList)#2 (1) {
  82.  ["__data":protected]=>
  83.   array(10) {
  84.     [0]=>
  85.     int(0)
  86.     [1]=>
  87.     int(1)
  88.     [2]=>
  89.     int(2)
  90.     [3]=>
  91.     int(3)
  92.     [4]=>
  93.     int(4)
  94.     [5]=>
  95.     int(5)
  96.     [6]=>
  97.     int(6)
  98.     [7]=>
  99.     int(7)
  100.     [8]=>
  101.     int(8)
  102.     [9]=>
  103.     int(9)
  104.   }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement