Maison > Java > javaDidacticiel > L'algorithme de recherche de cycle de Floyd détecte-t-il efficacement les boucles dans les listes liées ?

L'algorithme de recherche de cycle de Floyd détecte-t-il efficacement les boucles dans les listes liées ?

Linda Hamilton
Libérer: 2024-11-02 20:03:02
original
652 Les gens l'ont consulté

Does Floyd's Cycle-Finding Algorithm Efficiently Detect Loops in Linked Lists?

Détection de boucles dans les listes chaînées à l'aide de l'algorithme de recherche de cycles de Floyd

Les listes chaînées, une structure de données fondamentale en informatique, sont souvent utilisées pour représenter une séquence d'éléments. Dans certains scénarios, il est possible qu'une liste chaînée contienne une boucle, où le dernier nœud pointe vers un nœud précédent, créant ainsi une structure circulaire. Identifier la présence de telles boucles est une tâche cruciale pour diverses opérations impliquant des listes chaînées.

Algorithme de recherche de cycle de Floyd

L'algorithme de recherche de cycle de Floyd, également connu sous le nom d'algorithme de tortue et de lièvre, fournit un moyen efficace de détecter les boucles dans les listes chaînées. L'algorithme fonctionne sur la base du principe du déplacement de deux pointeurs (références) à des vitesses différentes dans la liste :

  1. Tortue (pointeur lent) : Avance d'un nœud à la fois.
  2. Hare (Fast Pointer): Avance de deux nœuds à la fois.

Principe :

  • Boucle présente : S'il y a une boucle dans la liste, la tortue et le lièvre finiront par se rencontrer au même nœud, indiquant la présence d'une boucle.
  • Pas de boucle : Si la liste ne contient pas de boucle, soit la tortue, soit le lièvre atteindra la fin de la liste (un pointeur nul), signalant l'absence de boucle.

Implémentation Java

La fonction Java suivante implémente l'algorithme de recherche de cycle de Floyd :

<code class="java">boolean hasLoop(Node first) {

    if(first == null) // list does not exist..so no loop either
        return false;

    Node slow, fast; // create two references.

    slow = fast = first; // make both refer to the start of the list

    while(true) {

        slow = slow.next;          // 1 hop

        if(fast.next != null)
            fast = fast.next.next; // 2 hops
        else
            return false;          // next node null => no loop

        if(slow == null || fast == null) // if either hits null..no loop
            return false;

        if(slow == fast) // if the two ever meet...we must have a loop
            return true;
    }
}</code>
Copier après la connexion

Avantages

L'algorithme de recherche de cycle de Floyd offre les avantages suivants :

  • Complexité spatiale constante :Il ne nécessite que deux pointeurs (références), ce qui rend sa complexité spatiale constante (O(1)).
  • Complexité temporelle linéaire :Le la complexité temporelle de l'algorithme est O(n), où n est le nombre de nœuds dans la liste chaînée.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal