プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

フロイドの循環検出アルゴリズム(ウサギとカメ)で連結リストのサイクルを検出する方法

フロイドの循環検出アルゴリズム(Floyd's Cycle Detection Algorithm)は、単方向連結リスト内に循環(ループ)が存在するかどうかを検出するための代表的なアルゴリズムの一つです。「ウサギとカメ(Hare and Tortoise)」アルゴリズムとも呼ばれ、2つのポインタを活用することで、追加のメモリをほとんど使わずに効率的にサイクルの有無を判定できます。

このアルゴリズムでは、最初に2つのポインタ(ウサギとカメ)がどちらもリストの先頭ノード(ヘッド)を指します。イソップ寓話の「ウサギとカメ」の物語と同じように、ウサギはカメの2倍の速さで進みます。そのため、ウサギが道の終わりに到達する頃には、カメはちょうど道の中間地点に到達している、というイメージです。

アルゴリズムの手順

  1. ウサギとカメの両方のポインタを、リストの先頭ノードで初期化します。

  2. ウサギはカメの2倍の速さで移動します。

  3. ウサギとカメを移動させ、ウサギが連結リストの終端に到達した場合は、リストにループが存在しないと判断して処理を終了します。

  4. 終端に達しない場合は、ウサギとカメの両方を前へ進めます。

  5. ウサギとカメが同じノードに到達した場合、リスト内に循環(サイクル)が存在することが確定するため、処理を終了します。

  6. それ以外の場合は、手順2に戻って処理を繰り返します。

アルゴリズムの擬似コード

tortoise := headNode
hare := headNode
foreach:
    if hare == end
        return 'There is No Loop Found.'
    hare := hare.next
    if hare == end
        return 'No Loop Found'
    hare = hare.next
    tortoise = tortoise.next
    if hare == tortoise
        return 'Cycle Detected'

計算量と特徴

このアルゴリズムの時間計算量はO(n)、空間計算量はO(1)です。ハッシュセットなどで訪問済みノードを記録する方法と異なり、追加のメモリを必要としないため、メモリ効率が求められる場面で特に有効です。

また、サイクルの検出後、カメを先頭に戻して両ポインタを同じ速度で進めると、2つのポインタはサイクルの開始ノード(循環の入口)で出会うことが数学的に証明されています。この性質を利用すれば、サイクルの有無だけでなく、その開始位置も特定できます。

  1. データ構造におけるYenのk最短経路アルゴリズム徹底解説

    単一の最短経路だけを返すのではなく、イエン(Yen)のk最短経路アルゴリズムでは、k本の最短経路を求めることができます。これにより、2番目に短い経路、3番目に短い経路といった具合に、順位の異なる複数の経路を順番に取得できるのが大きな特徴です。例として、地点Aから地点Bへ移動しなければならない場面を考えてみましょう。地点Aと地点Bの間には複数のルートが存在しますが、その中から時間計算量の観点で無駄のない真の最短経路を見つけ出し、目的地まで効率よく到達する必要があります。具体例で理解する下図の例を、頂点Bが「ピーク(頂上)」になっている橋だと考えてください。ある人が地点Aから地点Cへ橋を渡りたい場

  2. 式ツリー(構文木)とは?データ構造における構築アルゴリズムをわかりやすく解説

    式ツリー(Expression Tree)とは 式ツリー(構文木とも呼ばれます)は、二分木の一種であり、葉ノードに演算対象となる値(オペランド)を持ち、内部ノードにはその値に対して実行される演算子を格納する木構造です。木を下から順に評価することで、式全体の計算結果を求めることができます。 式ツリーの例 たとえば、4 + ((7 + 9) * 2) という数式を表現すると、次のような式ツリーになります。 この式の場合、「7 + 9 = 16」「16 * 2 = 32」「32 + 4 = 36」という順序で計算が進み、最終的な結果は 36 となります。 式ツリーの評価アルゴリズム 式ツリー