fruffl icon

binarySearch()

fruffl | 09/22/15 12:41:26 PM UTC | 0 ⭐ | 351 👁️ | Never ⏰ | []
PHP |

2.68 KB

|

None

|

0 👍

/

0 👎

 
    class Test implements IteratorAggregate, Countable
    {
        protected       $__data         = [];
 
        function __construct(array $__data = [])
        {
            reset($__data);
            foreach($__data as $v)
                $this->__data[] = $v;
        }
 
        function binarySearch($__int32, $__index = NULL, $__length = NULL)
        {
            NULL !== $__index   ?: $__index = 0x00;
            NULL !== $__length  ?: $__length    = $this->count() - $__index;
            
            if($__index + $__length > $this->count())
            {
                var_dump('out of range');
                return FALSE;
            }
        
            $t = $this->__data;
            $l = $__index;
            $r = $__index + $__length - 1;
            echo __FUNCTION__.":$__int32 from index:$l to index:$r";
            
            do
            {
                $mid = intval(($l + $r + ($r % 0x02))/0x02);
                //$mid = intval(($r+$l)/0x02);
                
                if($t[$mid] === $__int32)
                {
                    echo " | found $__int32@index $mid";
                    return intval(floor($mid));
                }
                else
                if($t[$mid] > $__int32)
                {
                    echo " | mid:$mid@ $t[$mid]>$__int32";
                    $r = $mid - 0x01;
                }
                else
                if($t[$mid] < $__int32)
                {
                    echo " | mid:$mid@ $t[$mid]<$__int32";
                    $l = $mid + 0x01;
                }
            }
            while($l <= $r && $mid >= 0x00);
            
            return FALSE;
        }
    }
 
 
            $B = new Test(range(0,9));
            foreach($B as $v)
            {
                $r = $B->binarySearch($v, 0, 10);
                $t = getType($r);
                if($r === false)
                    $r = PHP_EOL."\tfalse";
                print ' | ('.$t.') ';
                print $r.PHP_EOL;
            }
            var_dump($B);
 
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
binarySearch:1 from index:0 to index:9 | mid:5@ 5>1 | mid:2@ 2>1 | found 1@index 1 | (integer) 1
binarySearch:2 from index:0 to index:9 | mid:5@ 5>2 | found 2@index 2 | (integer) 2
binarySearch:3 from index:0 to index:9 | mid:5@ 5>3 | mid:2@ 2<3 | found 3@index 3 | (integer) 3
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
binarySearch:5 from index:0 to index:9 | found 5@index 5 | (integer) 5
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
binarySearch:7 from index:0 to index:9 | mid:5@ 5<7 | mid:8@ 8>7 | found 7@index 7 | (integer) 7
binarySearch:8 from index:0 to index:9 | mid:5@ 5<8 | found 8@index 8 | (integer) 8
binarySearch:9 from index:0 to index:9 | mid:5@ 5<9 | mid:8@ 8<9 | found 9@index 9 | (integer) 9
object(ILLI\Core\Std\ArrayList)#2 (1) {
  ["__data":protected]=>
  array(10) {
    [0]=>
    int(0)
    [1]=>
    int(1)
    [2]=>
    int(2)
    [3]=>
    int(3)
    [4]=>
    int(4)
    [5]=>
    int(5)
    [6]=>
    int(6)
    [7]=>
    int(7)
    [8]=>
    int(8)
    [9]=>
    int(9)
  }
}

Comments