Maison Java javaDidacticiel Maîtriser la recherche binaire en JavaScript et Java : un guide étape par étape

Maîtriser la recherche binaire en JavaScript et Java : un guide étape par étape

Nov 04, 2024 pm 10:54 PM

La recherche binaire est un algorithme fondamental que tout développeur doit comprendre, offrant un moyen très efficace de rechercher des éléments dans un tableau trié. Cet algorithme s'appuie sur une approche « diviser pour mieux régner », lui permettant de diviser par deux l'espace de recherche à chaque étape. Dans cet article, nous explorerons la recherche binaire en JavaScript et Java, couvrant les implémentations itératives et récursives.

Qu’est-ce que la recherche binaire ?

La recherche binaire est un algorithme conçu pour trouver la position d'une valeur cible dans un tableau trié. En tirant parti de la nature triée du tableau, la recherche binaire réduit efficacement l'espace de recherche, atteignant une complexité temporelle de O (log n). C'est beaucoup plus rapide qu'une recherche linéaire dans de grands ensembles de données.

Voici un aperçu de haut niveau :

  1. Commencez avec deux pointeurs, startIndex et endIndex, représentant la plage de recherche actuelle.
  2. Calculez l'index intermédiaire (midIndex) entre startIndex et endIndex.
  3. Comparez l'élément du milieu à la cible :
    • S'il correspond à la cible, renvoyez l'index.
    • Si l'élément du milieu est supérieur à la cible, la cible doit être dans la moitié gauche, alors ajustez endIndex.
    • Si l'élément du milieu est inférieur à la cible, la cible doit être dans la moitié droite, alors ajustez startIndex.
  4. Répétez le processus jusqu'à ce que la cible soit trouvée ou que startIndex dépasse endIndex, indiquant que la cible n'est pas dans le tableau.

Plongeons dans les exemples de code.


Recherche binaire itérative en JavaScript et Java

Mastering Binary Search in JavaScript and Java: A Step-by-Step Guide

Pour ceux d'entre vous qui aiment une boucle.

Implémentation JavaScript

En JavaScript, l'approche itérative utilise une boucle pour effectuer une recherche binaire. Voici à quoi cela ressemble :

const binarySearch = (arr, target) => {
  let startIndex = 0;
  let endIndex = arr.length - 1;

  while (startIndex <= endIndex) {
    let midIndex = Math.floor((startIndex + endIndex) / 2);

    if (arr[midIndex] === target) {
      return midIndex; // Target found
    } else if (arr[midIndex] < target) {
      startIndex = midIndex + 1; // Search in the right half
    } else {
      endIndex = midIndex - 1; // Search in the left half
    }
  }
  return -1; // Target not found
};

let nums = [-1, 0, 3, 5, 9, 12];
console.log(binarySearch(nums, 9)); // Output: 4
console.log(binarySearch(nums, 2)); // Output: -1

Implémentation Java

En Java, l'implémentation itérative est assez similaire, avec des ajustements pour la syntaxe Java :

public class BinarySearchExample {

    public static int binarySearch(int[] arr, int target) {
        int startIndex = 0;
        int endIndex = arr.length - 1;

        while (startIndex <= endIndex) {
            int midIndex = (startIndex + endIndex) / 2;

            if (arr[midIndex] == target) {
                return midIndex; // Target found
            } else if (arr[midIndex] < target) {
                startIndex = midIndex + 1; // Search in the right half
            } else {
                endIndex = midIndex - 1; // Search in the left half
            }
        }
        return -1; // Target not found
    }

    public static void main(String[] args) {
        int[] nums = {-1, 0, 3, 5, 9, 12};
        int target = 9;

        int result = binarySearch(nums, target);
        if (result != -1) {
            System.out.println("Element found at index: " + result);
        } else {
            System.out.println("Element not found in the array.");
        }
    }
}

Explication

Dans les deux implémentations :

  • Nous définissons startIndex et endIndex respectivement au début et à la fin du tableau.
  • Chaque itération trouve l'index du milieu, midIndex, et compare arr[midIndex] à la cible.
    • Si arr[midIndex] est égal à la cible, nous renvoyons midIndex.
    • Si arr[midIndex] est inférieur à la cible, nous déplaçons startIndex vers midIndex 1, limitant la recherche à la moitié droite.
    • Si arr[midIndex] est supérieur à target, nous déplaçons endIndex vers midIndex - 1, limitant la recherche à la moitié gauche.
  • La boucle se termine si startIndex dépasse endIndex, ce qui signifie que la cible n'est pas dans le tableau.

Recherche binaire récursive en JavaScript et Java

Pour l'approche récursive, nous définissons la fonction pour qu'elle s'appelle avec des indices mis à jour jusqu'à ce que la cible soit trouvée ou que la plage de recherche soit vide.

Mastering Binary Search in JavaScript and Java: A Step-by-Step Guide

Pour ceux d'entre vous qui aiment les débuts.

Implémentation JavaScript

En JavaScript, voici une implémentation de recherche binaire récursive :

const binarySearch = (arr, target) => {
  let startIndex = 0;
  let endIndex = arr.length - 1;

  while (startIndex <= endIndex) {
    let midIndex = Math.floor((startIndex + endIndex) / 2);

    if (arr[midIndex] === target) {
      return midIndex; // Target found
    } else if (arr[midIndex] < target) {
      startIndex = midIndex + 1; // Search in the right half
    } else {
      endIndex = midIndex - 1; // Search in the left half
    }
  }
  return -1; // Target not found
};

let nums = [-1, 0, 3, 5, 9, 12];
console.log(binarySearch(nums, 9)); // Output: 4
console.log(binarySearch(nums, 2)); // Output: -1

Implémentation Java

En Java, une recherche binaire récursive similaire peut être implémentée comme suit :

public class BinarySearchExample {

    public static int binarySearch(int[] arr, int target) {
        int startIndex = 0;
        int endIndex = arr.length - 1;

        while (startIndex <= endIndex) {
            int midIndex = (startIndex + endIndex) / 2;

            if (arr[midIndex] == target) {
                return midIndex; // Target found
            } else if (arr[midIndex] < target) {
                startIndex = midIndex + 1; // Search in the right half
            } else {
                endIndex = midIndex - 1; // Search in the left half
            }
        }
        return -1; // Target not found
    }

    public static void main(String[] args) {
        int[] nums = {-1, 0, 3, 5, 9, 12};
        int target = 9;

        int result = binarySearch(nums, target);
        if (result != -1) {
            System.out.println("Element found at index: " + result);
        } else {
            System.out.println("Element not found in the array.");
        }
    }
}

Comment fonctionne la version récursive

Dans chaque appel récursif :

  • L'indice du milieu, midIndex, est calculé.
  • Si arr[midIndex] correspond à la cible, il renvoie l'index.
  • Si arr[midIndex] est supérieur à la cible, la recherche continue dans la moitié gauche (endIndex devient midIndex - 1).
  • Si arr[midIndex] est inférieur à la cible, la recherche continue dans la moitié droite (startIndex devient midIndex 1).
  • Le cas de base if (startIndex > endIndex) garantit que la récursion s'arrête si la cible n'est pas trouvée.

    Analyse de complexité

    • Complexité temporelle : les versions itératives et récursives ont une complexité temporelle de O(log n), car chaque étape divise par deux l'espace de recherche.
    • Complexité spatiale : L'approche itérative est O(1) pour l'espace, tandis que l'approche récursive a une complexité spatiale de O(log n) en raison de la pile d'appels.

    Quand utiliser la recherche binaire

    La recherche binaire est idéale lorsque :

    • Le tableau est trié : La recherche binaire ne fonctionne que sur les tableaux triés.
    • L'efficacité est essentielle : sa complexité temporelle O(log n) est très efficace pour les grands ensembles de données.

    Si le tableau n'est pas trié, envisagez de le trier d'abord (à un coût O(n log n)) ou d'utiliser une recherche linéaire si l'ensemble de données est petit.


    Conclusion

    La recherche binaire est un algorithme polyvalent et efficace pour localiser des éléments dans des tableaux triés. Que vous choisissiez l'approche itérative ou récursive, comprendre la recherche binaire est précieux pour améliorer les performances de vos applications. Essayez les deux implémentations en JavaScript et Java pour avoir une idée de leur fonctionnement et voir laquelle convient le mieux à votre cas d'utilisation spécifique.


    ? Référence

    • Recherche binaire
    • Algorithmes de Grookking
    • Notation Big O

    ? Parle moi

    • LinkedIn
    • Github
    • Portefeuille

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment créer un fichier en java Comment créer un fichier en java Sep 21, 2025 am 03:54 AM

UseFile.CreateEnewFile () toCreateaFileOnlyiFitDoOesn’texist, EvitingoverWriting; 2.Preferfiles.CreateFile () FromNio.2Formodern, SafeFilecreationThatFailSiftheFileExists; 3.UseFileWriterorPrintwriterWistereAdMedimMedimate

Comment ajouter un fichier JAR au cours de classe en Java? Comment ajouter un fichier JAR au cours de classe en Java? Sep 21, 2025 am 05:09 AM

Utilisez le paramètre -cp pour ajouter le pot au ClassPath, afin que le JVM puisse charger ses classes et ressources internes, telles que Java-Cplibrary.jarcom.example.main, qui prend en charge plusieurs pots séparés par semi-colons ou couleurs, et peut également être configuré via des variables d'environnement de ClassPath Variables ou Manifest.mf.

Comment implémenter une interface dans Java? Comment implémenter une interface dans Java? Sep 18, 2025 am 05:31 AM

Utilisez le mot-clé Implements pour implémenter l'interface. La classe doit fournir des implémentations spécifiques de toutes les méthodes dans l'interface. Il prend en charge plusieurs interfaces et est séparé par des virgules pour s'assurer que les méthodes sont publiques. Les méthodes par défaut et statiques après Java 8 n'ont pas besoin d'être réécrites.

Comment lire un fichier de propriétés en Java? Comment lire un fichier de propriétés en Java? Sep 16, 2025 am 05:01 AM

Utilisez la classe Properties pour lire facilement les fichiers de configuration Java. 1. Mettez Config.Properties dans le répertoire de ressources, chargez-le via getClassOader (). GetResourceAsStream () et appelez la méthode Load () pour lire la configuration de la base de données. 2. Si le fichier est dans un chemin externe, utilisez FileInputStream pour le charger. 3. Utilisez GetProperty (Key, DefaultValue) pour gérer les clés manquantes et fournir des valeurs par défaut pour garantir la gestion des exceptions et la vérification des entrées.

Construire des applications extensibles avec l'interface de service de service Java (SPI) Construire des applications extensibles avec l'interface de service de service Java (SPI) Sep 21, 2025 am 03:50 AM

Javaspi est un mécanisme de découverte de service intégré dans JDK et met en œuvre une expansion dynamique orientée vers l'interface via ServiceLoader. 1. Définissez l'interface de service et créez un fichier nommé avec le nom complet de l'interface sous Meta-Inf / Services /, et écrivez le nom entièrement qualifié de la classe d'implémentation; 2. Utilisez ServiceLoader.Load () pour charger la classe d'implémentation, et le JVM lira automatiquement la configuration et l'instanciera; 3. Le contrat d'interface doit être clarifié lors de la conception, de la priorité de support et du chargement conditionnel et fournit une implémentation par défaut; 4. Les scénarios d'application incluent l'accès au canal multi-paiement et la vérification du plug-in; 5. Faites attention aux performances, à ClassPath, à l'isolement des exceptions, à la sécurité des fils et à la compatibilité des versions; 6. Dans Java9, la fourniture peut être utilisée en combinaison avec des systèmes de modules.

Une compréhension approfondie des connexions persistantes HTTP: politiques et pratiques pour envoyer plusieurs demandes sur la même prise Une compréhension approfondie des connexions persistantes HTTP: politiques et pratiques pour envoyer plusieurs demandes sur la même prise Sep 21, 2025 pm 01:51 PM

Cet article explore en profondeur le mécanisme d'envoi de plusieurs demandes HTTP sur la même prise TCP, à savoir la connexion persistante HTTP (Keep-Alive). L'article clarifie la différence entre les protocoles HTTP / 1.x et HTTP / 2, souligne l'importance de la prise en charge côté serveur pour les connexions persistantes et comment gérer correctement la connexion: fermer les en-têtes de réponse. En analysant les erreurs courantes et en fournissant les meilleures pratiques, nous visons à aider les développeurs à construire des clients HTTP efficaces et robustes.

Tutoriel Java: comment aplatir une liste de table imbriquée et remplir ses éléments dans un tableau Tutoriel Java: comment aplatir une liste de table imbriquée et remplir ses éléments dans un tableau Sep 18, 2025 am 07:24 AM

Ce didacticiel détaille comment traiter efficacement les listes de table imbriquées contenant d'autres listes de tableaux en Java et fusionner tous ses éléments internes en un seul tableau. L'article fournira deux solutions de base grâce à l'opération FlatMap de l'API Java 8 Stream: aplatissant d'abord une liste, puis remplissant le tableau, et créant directement un nouveau tableau pour répondre aux besoins de différents scénarios.

Comprendre les génériques Java et les jokers Comprendre les génériques Java et les jokers Sep 20, 2025 am 01:58 AM

JavagenerricsprovideCompile-TimetypePesafetyAndeliminateStingByAllowingTypeParameTersersonClasses, Interfaces et Methods; Wildcards (?,

See all articles