Hulp met Binary Search aub

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Sunil Kisoensingh

Sunil Kisoensingh

09/12/2016 16:57:56
Quote Anchor link
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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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);
?>
 
PHP hulp

PHP hulp

21/11/2024 21:31:38
 
Robert Steegh

Robert Steegh

11/12/2016 12:58:02
Quote Anchor link
>> 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.
Gewijzigd op 11/12/2016 13:05:24 door Robert Steegh
 
Ben van Velzen

Ben van Velzen

11/12/2016 13:42:48
Quote Anchor link
Als aanvulling hierop: deze deling levert altijd een geheel getal op, en dat doet jouw regel niet gegarandeerd.
 
Sunil Kisoensingh

Sunil Kisoensingh

14/12/2016 09:22:29
Quote Anchor link
dankjewel voor de reacties...

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

heb dit nu en dit werkt prima:)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.