私がフロイドのサイクル検出アルゴリズムを提案しようとしていたように、リチの投稿は私にそれを打ち負かしました。ただし、完全な状態の比較を高速化することにより、全体をより実用的にすることができます。
提案されたアルゴリズムのボトルネックは、完全な状態を比較することにあります。これらの比較は通常終了しませんが、最初の違いで早期に停止します。最適化の1つは、過去の違いがどこで発生したかを記憶し、最初に状態のそれらの部分をチェックすることです。たとえば、場所のリストを維持し、完全な比較を行う前にこのリストを確認します。このリストの場所で差異が明らかになったら、比較を(失敗して)停止し、その場所をリストの先頭に移動します。
別の(そして潜在的によりスケーラブルな)アプローチは、増分ハッシュを使用することです。状態の一部が変化したときにハッシュ値がO(1)で簡単に調整できるように、完全な状態の関数を選択します。たとえば、いくつかの大きな素数のmodの状態語の重み付き合計を取り、他の大きな素数のmodの重みなし合計と連結します(異なる重みとモジュラスを持つモジュール式の重み付き平方和もスローできます)。この方法では、ハッシュの更新は各実行ステップでO(1)時間かかり、ヒットするまで比較はO(1)時間かかります。偽陽性(つまり、状態が異なるときにハッシュが一致する)の可能性は非常に低く、これが発生した場合でも、多数の真のネガティブで償却されます(偽ネガティブは不可能です)。
もちろん、実際には、数字piの数字を生成するような状況になる可能性が高くなります。別のよくある可能性は、無限ループがメモリを割り当てることです。その場合、利用可能なすべてのメモリがすぐに使い果たされます。
アルゴリズムとデータ構造に関する私のコースでは、オートグレーダーは、時々無限ループになる学生の提出物に対処する必要があります。これは、30秒のタイムアウトと特定のメモリ制限によって処理されます。どちらも、グレーディングの一部として課すランタイムおよびメモリの予算よりもはるかに緩やかです。このようなプログラムはかなり遅く実行されるため、真の無限ループ検出を実装することがこのコンテキストで多くの意味をなすかどうかはわかりません(これは状態ハッシュのハードウェアサポートが役立つ可能性がありますが、ここでも追加の使用が必要ですこれを正当化する)。プログラムがタイムアウトしたことを生徒が知っている場合、通常は無限ループを見つけることができます。