ホームページ  >  記事  >  Java  >  フロイドのアルゴリズムはリンクされたリスト内のループをどのように検出するのでしょうか?

フロイドのアルゴリズムはリンクされたリスト内のループをどのように検出するのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 01:32:02358ブラウズ

How Does Floyd's Algorithm Detect Loops in Linked Lists?

フロイドのアルゴリズムを使用したリンク リスト内のループの検出

指定されたリンク リストにループが含まれているかどうかを判断することは、Java プログラミングでは困難なタスクとなる場合があります。リストの最後のノードが null 参照ではなく前のノードを参照すると、ループが発生します。

ループを効率的に検出するために、開発者は多くの場合、カメとウサギのアルゴリズムとしても知られるフロイドのサイクル発見アルゴリズムを採用します。 。このアルゴリズムは、低速と高速の 2 つの参照を使用し、異なる速度でリストを走査します。

たとえば、低速参照は 1 ノード分進み、高速参照は 2 ノード分進みます。リンクされたリストにループが含まれている場合、これらの参照は最終的に一致します。一方、ループがない場合、低速参照または高速参照 (またはそれらの後続の参照) は、他方がリストの最後に到達する前に null になります。

これは、フロイドのアルゴリズムの Java 実装です。 :

<code class="java">boolean hasLoop(Node first) {
    if (first == null) {
        return false; // List does not exist, so no loop
    }

    Node slow, fast; // Create two references.
    slow = fast = first; // Make both refer to the start of the list.

    while (true) {
        slow = slow.next; // One hop.

        if (fast.next != null) {
            fast = fast.next.next; // Two hops.
        } else {
            return false; // No loop.
        }

        if (slow == null || fast == null) {
            return false; // No loop.
        }

        if (slow == fast) {
            return true; // Loop detected.
        }
    }
}</code>

このアルゴリズムは、O(1) 空間の複雑さを必要とし、O(n) 時間で実行されるため、メモリ効率が高く、適度に時間がかかります。

以上がフロイドのアルゴリズムはリンクされたリスト内のループをどのように検出するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。