Vandaag heb ik in mijn college een introductie les gehad over algoritmes. Hierbij werd binary search als voorbeeld gebruikt. Thuis ben ik daar verder mee gegaan maar loop nu tegen een probleem aan. Ik heb na het bestuderen van de slides van het college het onderstaande gemaakt. Dit werkt wel maar niet helemaal goed aangezien het niet alle waarden kan vinden. Nu ben ik wezen googlen en vond een fix. Hier stond alleen helemaal geen uitleg bij en ik wil het probleem graag snappen ipv gewoon kopieeren. Op de eerste regel van de while loop pak ik het gemiddelde van de array door het kleinste punt en grootste punt op te tellen en weer door 2 te delen. Dit levert maar beperkte resultaten op, echter als ik die regel vervang met het stukje wat in de comment staat werkt hij prima en vindt hij alles. Kan iemand mij uitleggen waarom dit zo is, doe ik iets fout bij het berekenen van het gemiddelde? (blijkbaar, maar wat precies?) en als laatste wat betekent ">>1"? Ik heb ">>" nog nooit eerder gezien. Hulp wordt norm gewaardeerd. Alvast bedankt

<?php
$numbers = array(0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144);
$value = $_POST['value'];

function binary_search($numbers,$value){
sort($numbers);
$left = 0;
$right = count($numbers)-1;
$result = false;

while ($left <= $right && !$result){
$mid = ($left + $right)/2; // het probleem zit hem in deze regel, $mid = ($left+$right)>>1 werkt wel

if ($numbers[$mid] == $value){
echo "$numbers[$mid] komt voor in de array";
$result = true;
} elseif ($numbers[$mid] < $value){
$left = $mid +1;
} else {
$right = $mid -1;
}
}

if (!$result){
echo "Het getal komt niet voor in de array";
}
}

echo binary_search($numbers,$value);
echo "<br><br>";
sort($numbers);
print_r($numbers);
?>
>> betekent shift right. Het is bedoeld om in een binaire waarde the bits 1 plaats te verschuiven. Dus 00001000 wordt 00000100. << betekent shift left. Shift right is hetzelfde als delen door 2.
Als aanvulling hierop: deze deling levert altijd een geheel getal op, en dat doet jouw regel niet gegarandeerd.
dankjewel voor de reacties...

$mid = floor(($left + $right)/2);

heb dit nu en dit werkt prima:)

Reageren