Implémentation simple de la recherche binaire

Enregistrez simplement la mise en œuvre de la recherche binaire

Annuaire d'articles

avant-propos

1. Qu'est-ce que la recherche binaire ?

2. Mise en œuvre du code

Résumer


avant-propos

Un jour, Liuhua est venu dans une entreprise pour un entretien, et l'intervieweur a dit : "Donnez-vous un tableau ordonné d'entiers et une valeur, et vous pouvez écrire une requête simple pour renvoyer l'indice." Lorsque vous avez entendu cela, vous avez éclaté de rire jusqu'à l'arrière de votre tête. Sortez le clavier et tapez une boucle for pour parcourir la requête. Quand l'intervieweur l'a vu, il a hoché la tête et vous a dit avec ferveur : "Jeune homme, je vois que tes os vont bien. Retourne et attends les nouvelles. Je pense que tu as une grande chance !" Après avoir entendu cela, vous êtes rentré chez vous tout excité et avez attendu les nouvelles en pensant "Ce n'est qu'une interview, mais c'est tout..." À partir de ce moment, il n'y a plus eu de suivi.

1. Qu'est-ce que la recherche binaire ?

Étant donné une valeur, interrogez un tableau d'entiers ordonné , tel que [1, 2, 3, 4, 5, 6, 7, 8], vous devez trouver la position (indice) correspondant à 5. Sélectionnez le nombre au milieu du tableau (4 ici) et comparez-le avec la valeur cible à rechercher, et renvoyez directement la réponse (indice) s'ils sont égaux. Sinon, deux cas doivent être envisagés :

1) Si le nombre au milieu est supérieur à la valeur cible, tous les nombres à droite du nombre du milieu sont supérieurs à la valeur cible , tous exclus

2) Si le nombre au milieu est inférieur à la valeur cible, tous les nombres à gauche du nombre du milieu sont inférieurs à la valeur cible , tous exclus

Puis ça continue comme ça.

Remarque : Il a été souligné à plusieurs reprises ici qu'il s'agit d'un tableau d'entiers ordonné. Après tout, s'il n'est pas ordonné, il est impossible de déterminer que le nombre de l'autre côté du nombre du milieu peut être complètement supérieur (inférieur) au nombre cible, puis exclu . Deuxièmement, la valeur cible de la requête ne peut être qu'un et non multiple.

2. Mise en œuvre du code

L'ouverture et la fermeture de la recherche binaire sont différentes, et les méthodes d'itération correspondantes sont également différentes. Il existe les deux méthodes suivantes :

  • Fermer à gauche et fermer à droite[left, right]

  • Gauche fermée droite ouverte [gauche, droite)

 Le code de fermeture à gauche et à droite est le suivant :

    private static int binarySearch(int target, int[] arry) {
        int left = 0, right = arry.length - 1;
        while (left <= right){
            int mid = (left + right) >>> 1;
            if (arry[mid] == target){
                return mid;
            } else if (arry[mid] < target) {
                left = mid + 1;
            } else if (arry[mid] > target) {
                right = mid - 1;
            }
        }
        return -1;
    }

La différence entre fermé à gauche et ouvert à droite est que la limite droite du tableau sélectionne la longueur du tableau, tandis que la limite fermée à gauche et fermée à droite sélectionne la longueur du tableau -1. Il y a aussi le jugement de la condition de boucle. Pour plus de détails, veuillez consulter : [Recherche binaire] Blog détaillé de Diagram_Charon_cc - Blog CSDN

code afficher comme ci-dessous:

    private static int binarySearch(int target, int arry[])
    {
        int left = 0;
        int right = arry.length; //定义target在左闭右开的区间里,即[left, right)
        while (left < right) {	//因为left = right的时候,在[left, right)区间上无意义
            int middle = (left + right) >>> 1;
            if (arry[middle] > target) {
                right = middle; //target 在左区间,在[left, middle)中 
            } else if (arry[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        // 没找到就返回-1
        return -1;
    }

test:

Étant donné un tableau d'entiers ordonné (croissant) nums avec n éléments et une cible de valeur cible, écrivez une fonction pour rechercher la cible en nums et renvoyez l'indice si la valeur cible existe, sinon renvoyez -1.

Exemple un :

Entrée : chiffres = [-1,0,3,5,9,12], cible = 9
Sortie : 4
Explication : 9 apparaît en chiffres avec indice 4

résultat:

Exemple deux :

Entrée : nums = [-1,0,3,5,9,12], target = 2
Sortie : -1
Explication : 2 n'existe pas en nums donc renvoie -1

résultat:


Résumer

Les deux points les plus importants de la recherche binaire sont la condition de boucle et le problème d'affectation d'intervalle ultérieur.

Les deux sont interdépendants et s'influencent mutuellement, ils doivent donc être unifiés. Si les deux ne le sont pas, des problèmes surgiront.

Par conséquent, la condition de boucle et le problème d'affectation doivent être unifiés, c'est-à-dire l'invariant de boucle.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_58403235/article/details/129843775
conseillé
Classement