Algorithme de recherche binaire en python
Je suis en train de mettre en œuvre les binaires de recherche en python et de l'avoir écrit comme suit. Cependant, je ne peux pas le faire arrêter à chaque fois que needle_element est plus grand que le plus grand élément dans le tableau.
Pouvez-vous aider? Merci.
def binary_search(array, needle_element):
mid = (len(array)) / 2
if not len(array):
raise "Error"
if needle_element == array[mid]:
return mid
elif needle_element > array[mid]:
return mid + binary_search(array[mid:],needle_element)
elif needle_element < array[mid]:
return binary_search(array[:mid],needle_element)
else:
raise "Error"
source d'informationauteur AbdulFattah Popoola | 2012-02-29
Vous devez vous connecter pour publier un commentaire.
Dans le cas que
needle_element > array[mid]
vous actuellement passerarray[mid:]
de l'appel récursif. Mais vous savez quearray[mid]
est trop petit, de sorte que vous pouvez passerarray[mid+1:]
à la place (et d'ajuster le retour de l'index en conséquence).Si l'aiguille est plus grand que tous les éléments dans le tableau, faisant de cette façon vous donnera par la suite un tableau vide, et une erreur est signalée comme prévu.
Remarque: la Création d'un sous-tableau à chaque fois, de mauvaises performances pour les grands tableaux. C'est mieux de passer dans les limites du tableau à la place.
Il serait beaucoup mieux de travailler avec un
lower
etupper
index Lasse V. Karlsen a été suggéré dans un commentaire à la question.Ce serait le code:
lower < upper
va s'arrêter une fois que vous avez atteint le plus petit nombre (à partir de la gauche)if lower == x: break
va s'arrêter une fois que vous avez atteint le nombre le plus élevé (à partir de la droite)Exemple:
tableau[mi:] crée un nouveau sous-copier à chaque fois que vous l'appelez = lent. Aussi, vous utiliser la récursivité, qui en Python est lent, trop.
Essayez ceci:
Pourquoi ne pas utiliser le traversent, le module? Il devrait faire le travail vous avez besoin d'---moins de code pour vous à maintenir et à tester.
Vous pouvez améliorer votre algorithme, comme les autres l'ont suggéré, mais nous allons d'abord examiner pourquoi il ne fonctionne pas:
Vous êtes coincé dans une boucle car si
needle_element > array[mid]
vous êtes, y compris l'élément demid
dans la traversée de la matrice de vous chercher ensuite. Donc, si l'aiguille n'est pas dans le tableau, vous finirez par être à la recherche d'un tableau de longueur pour toujours. Passerarray[mid+1:]
à la place (c'est légal, même simid+1
n'est pas un index valide), et vous finirez par appel de votre fonction avec un tableau de longueur zéro. Donclen(array) == 0
signifie "pas trouvé", pas une erreur. Gérer de manière appropriée.Si vous faites une recherche binaire, je suppose que le tableau est trié. Si c'est vrai, vous devriez être en mesure de comparer le dernier élément du tableau à la
needle_element
. Comme le poulpe dit, cela peut être fait avant que la recherche commence.Vous pouvez juste vérifier que
needle_element
est dans les limites du tableau avant de commencer à tous. Ce sera plus efficace aussi, puisque vous n'aurez pas à faire plusieurs étapes pour arriver à la fin.Toutes les réponses ci-dessus sont vraies , mais je pense qu'il serait bon de partager mon code
Il renvoie l'index de la clé dans le tableau en utilisant récursive.
round() est une fonction de convertir des float en entier et dont le code est rapide et va de cas attendus[O(logn)].
Sans inférieure/supérieure de l'index, cela devrait également faire:
En Utilisant La Récursivité:
C'est une queue solution récursive, je pense que c'est plus propre que la copie partielle des tableaux, puis de suivre les indices pour le retour: