今日、リンクされたリストのループを検出するフロイドのアルゴリズムを読んでいました。ループ検出を高速化するために、複数のノード (たとえば 2 つ) をスキップした方がよいのではないかと思っていました。
例えば:
fastptr=fastptr->next->next->next.
変更中は副作用が考慮されることに注意してくださいfastptr
。
今日、リンクされたリストのループを検出するフロイドのアルゴリズムを読んでいました。ループ検出を高速化するために、複数のノード (たとえば 2 つ) をスキップした方がよいのではないかと思っていました。
例えば:
fastptr=fastptr->next->next->next.
変更中は副作用が考慮されることに注意してくださいfastptr
。
あなたの提案はまだ正しいですが、それはアルゴリズムの速度を変えません。ウィキでカメとウサギのアルゴリズムを見てみると:
アルゴリズムの重要な洞察は、任意の整数i≥μおよびk≥0の場合、x i = x i +kλです。ここで、λは検出されるループの長さであり、μはループの開始位置です。特に、i =kλ≥μの場合は常に、x i = x2iとなります。
太字の部分では、 x i = x 3i、またはその他の係数と言うこともできますが、重要な洞察はiを見つけることです。ジャンプの数は重要ではなく、アルゴリズムの順序は、i。