2012-10-28 8 views
0

binaire Ceci est mon-recherche binaire:Mettre en œuvre la recherche

int binarySearch(int arr[], int value, int min, int max){ 
    int pos = -1; 

    while (max >= min && pos == -1) { 
    int mid = (max+min)/2; 

    if(arr[mid] == value){ 
     pos = mid; 
    }else if(arr[mid] < value){ 
     min = mid +1; 
    }else if(arr[mid] > value){ 
     max = mid -1; 
    } 

    } 
    return pos; 
} 

Je l'appelle ainsi:

//Arr contain values 0-63 
int i = binarySearch(arr, 64, 0, 64); 

Ce sont les valeurs moyennes

32 48 56 60 62 63 64 

Au dernier chèque I essayez d'accéder à un élément à la position 64, lorsque la dernière position dans le tableau est 63.

Quel est le problème avec ma mise en œuvre?

+2

Je suggère de parcourir le code dans un débogueur, ligne par ligne, tout en vérifiant les valeurs de 'max',' min' et 'mid'. Assurez-vous également que le tableau est effectivement trié. –

+0

Le code fonctionne bien avec moi sur les blocs de code. Assurez-vous que le tableau est trié et contient exactement 64 éléments –

+1

-1 pour le vidage de votre lien dans le chat. – Puppy

Répondre

3

Votre tableau contient des valeurs de 0 -63 (comme vous l'avez mentionné) et vous donnez les valeurs suivantes pour min et max: min = 0, max = 64. Et changez la ligne suivante pour que votre code puisse gérer des valeurs int élevées sinon il y a des chances de dépassement de mémoire.

 int mid = min+(max-min)/2; 

La formule ci-dessus se simplifie en (max + min)/2 lui-même mais de protéger débordement d'entier.

+0

Ce n'est pas nécessaire. Essayez de courir avec les deux versions. –

+2

@CodingMash: Eh bien, cela aurait du sens si vos index étaient énormes. Mais vous seriez à peine capable d'allouer un tableau aussi grand en pratique. – Groo

0

Lorsque max == min, votre longueur est 0, vous ne devriez donc pas entrer dans la boucle. Changer en condition (max > min && ...) si votre haute eau est « un passé la fin » (et votre eau haute devrait probablement être « un après la fin », il est un modèle très utile)

Oh, et le rendre max = mid place de max = mid-1, comme max représente "un au-delà de la fin" plutôt que le dernier élément.

En guise d'amélioration générale du style de codage, lorsque vous faites ce type de code, toss affirme partout que vos index sont dans les limites. Cela peut non seulement détecter les problèmes plus tôt, il peut aussi vous aider à raisonner sur quelles valeurs sont dans les limites et qui ne sont pas ...

+0

Si je fais max> min je ne serai jamais capable de trouver quoi que ce soit à la position 0 dans le tableau. – Carlj901

+0

Lorsque 'max = 1' et' min = 0', qu'est-ce que 'mid'? Il y a deux problèmes dans votre code, tous deux liés à la signification de 'max'. Je vous conseille de dire que les index de recherche sont {min, min + 1, min + 2, ..., max-2, max-1): max 'est" passé le dernier index à chercher ". Cela s'aligne avec le passage de '64' dans' max' pour commencer. Cependant, pour résoudre ce problème, lorsque vous trouvez que la valeur de 'mid' est trop grande, la plage de recherche doit être [' min', 'mid') et non [' min', 'mid-1'). (J'utilise [a, b) pour indiquer l'intervalle à demi-ouvert entre a et b, qui n'inclut pas b) – Yakk

0

essayer

while (max > min && pos == -1) { 
int mid = (max+min)/2; 

if(arr[mid] == value){ 
    pos = mid; 
}else if(arr[mid] < value){ 
    min = mid; 
}else if(arr[mid] > value){ 
    max = mid; 
} 

}

+3

Les réponses au code seulement ne sont pas appréciées dans SO. –

+0

Ensuite, je ne peux pas accéder au premier élément. – Carlj901

Questions connexes