Optimiser L'Algorithme De Recherche Binaire
Dans un système binaire de recherche, nous avons deux comparaisons pour plus que, et d'autres moins
que, sinon, la valeur moyenne. Comment voulez-vous optimiser de sorte que nous avons besoin de vérifier qu'une seule fois?
bool binSearch(int array[], int key, int left, int right)
{
mid = left + (right-left)/2;
if (key < array[mid])
return binSearch(array, key, left, mid-1);
else if (key > array[mid])
return binSearch(array, key, mid+1, right);
else if (key == array[mid])
return TRUE; //Found
return FALSE; //Not Found
}
Est-il une raison de ne pas utiliser brecherche()?
OriginalL'auteur Ganesh M | 2009-03-23
Vous devez vous connecter pour publier un commentaire.
Je voudrais essayer le brecherche() standard fonction première. Les Chances sont bonnes qu'il peut mieux que votre approche.
cela ressemble tout à fait décent pour moi, comme un processus itératif de mise en œuvre de sourceware.org/git/?p=glibc.git;a=blob_plain;f=stdlib/...
comment feriez-vous pour l'optimiser?
un bon livre de décrire le processus d'optimisation cs.bell-labs.com/cm/cs/pearls
désolé, je n'ai pas le livre, et je ne vais pas l'acheter juste pour voir comment il est la mise en œuvre d'une recherche binaire.
OriginalL'auteur quinmars
Il n'est pas conseillé d'essayer et d'optimiser dans la façon dont vous décrivez. À partir de la Binaire de l'Algorithme de Recherche d'article sur Wikipédia:
Certaines langues, comme le Fortran, trois de comparaison qui permet à cette étape avec une comparaison que les branches de trois sections différentes (voir la dixième ligne de la Comparaison à trois exemple). Si votre langue n'est pas en faveur d'une triple test (la plupart des langues ne le font pas), puis deux comparaisons est le meilleur que vous pouvez faire.
Je serait vous conseillons de vérifier les itératif de mise en œuvre à partir du même article, si.
OriginalL'auteur Bill the Lizard
J'ai essayé de reconstituer l'optimisation des étapes de l'algorithme recherche binaire. Je commence avec cette version itérative:
L'élimination des comparaisons à partir de la boucle:
Déroulage de la petite taille de la boucle:
Réordonnancement des instructions if, le déplacement des cas particuliers [taille==pow(2,N)-1] à la fin:
Changer si les déclarations d'une instruction switch:
L'extension de l'instruction switch pour gérer tous les cas particuliers:
Éliminer le général de gestion des cas dans le code: [ w est le plus petit nombre: w==pow(2,N)-1; taille<=2*(l+1) ]
La dernière étape ce que j'ai fait était la simplification de l'affaire des étiquettes [à partir de: '((size_t)1<<n)-1': 'n'] mais j'ai trouvé que le code modifié a été plus lente sur mon vieux PC que la version précédente.
OriginalL'auteur
Si vous souhaitez optimiser votre binaire de l'algorithme de recherche, vous devez remplacer la récursivité à l'itération. Voir des exemples sur wikipédia.
Laissez-moi savoir si vous avez besoin de plus de détails.
OriginalL'auteur mgamer
Dans le code que vous avez posté, vous pouvez supprimer le dernier de comparaison. C'est, si
key
n'est pas moins dearray[mid]
ou supérieure àarray[mid]
, alors c'est par définition égale. Ainsi, votre code devient:Notez également que j'ai supprimé la dernière ligne. Dans votre code, il est impossible pour le
return FALSE;
jamais être exécutée. Je suppose que vous avez un chèque au début de votrebinSearch
qui vérifie sileft
<=right
.En C, il n'y a aucun moyen de faire une comparaison à trois ou à la direction basée sur moins que, égal à, supérieur à, de sorte que vous avez à faire deux comparaisons pour sélectionner parmi trois possibilités.
OriginalL'auteur Jim Mischel
Pour les entiers, il n'a pas d'importance, ne le faites pas.
Pour le plus cher des comparaisons utilisez -1, 0, 1 <=, >, comme dans la bibliothèque C de la fonction strcmp ou de Java compareTo().
Si le tableau ont été consulté plus d'une fois que serait vraiment moche compilateur.
OriginalL'auteur starblue
OriginalL'auteur Rajendra Uppal
Ganesh M - Si la clé n'existe pas dans le tableau, alors votre fonction sera coincé à l'intérieur d'une boucle sans fin. Il ne peut jamais retourner FALSE.
Quel est le meilleur moyen de trouver le point d'insertion, si la clé n'existe pas?
Conditionnelle "si en cascade" de la comptabilité pour les <, = = et > ne retourne TRUE, ou de continuer à calculer pour toujours.
J'ai besoin de la condition optimale pour déterminer si une touche a été isolé comme n'existant pas.
Je sais que cela va ralentir la recherche, mais je tiens à le ralentir en le moins.
jouer avec log(N)/log(2) semble être une bonne idée, mais quand ce N est pas une puissance de 2, les choses peuvent aller détraque.
Peut-être, je devrais choisir un tableau avec une taille de puissance de 2, et de l'utilisation d'une simple boucle while?
ne vérifiant si le milieu == soit lié augmenter le nombre de comparaisons trop?
OriginalL'auteur JohnPaul
Ses une question de l'exercice en K&R deuxième édition.
OriginalL'auteur Sangeet
OriginalL'auteur pankaj
end = cmp>0 ? mid-1 : end
pour le faire sans branches. Ce n'est pas toujours le meilleur, cependant, si les données sont froid dans le cache; spéculative de l'exécution peut effectivement déclencher prefetch et d'éviter une dépendance de données de la chaîne de défauts de cache. à Propos de l'dépourvu de branches de recherche binaire a plus, et montre une façon de l'écrire qui ne nécessite qu'uncmov
/ autres sans branches ALU sélectionner.Fascinant, merci pour le partage!
OriginalL'auteur jjxtra
source: http://calcs.appspot.com/docview?id=agVjYWxjc3IPCxIIRG9jdW1lbnQY0w8M
alors que faire si ses pas C ?
aucun de ces grands prblem qui n'est pas C, mais il ne montre pas quelque chose de nouveau?
OriginalL'auteur Hardbug