2017-11-09 6 views
0

フロイドのサイクル検出アルゴリズムの実行時の複雑さを言及したオンラインソースによれば、O(n)です。 セイ、フロイドのサイクル検出の実行時の複雑さ

p = slow pointer 
q = fast pointer 
m = the distance from start of linked list to first loop node 
k = the distance of the meeting point of fast and slow nodes from the first loop node 
l = length of loop 
rp = number of loop rotations by p before meeting q. 
rq = number of loop rotations by q before meeting p. 

実行時間の複雑さは、この値はO(N)であるどのよう= M + RP * 1 + K すべきですか?

答えて

1

リストは、次に< = NステップでNノードを有し、いずれか早くポインタがリストの終わりを見つける、またはそこループであり、低速ポインタはループになります。

ループの長さはM < = Nとなります。遅いポインタがループに入ると、高速ポインタと低速ポインタの両方がループ内で永久にスタックされます。各ステップでは、高速ポインターとスローポインターの間の距離は1だけ増加します。距離がMで割り切れる場合、高速ポインターとスローポインターは同じノード上にあり、アルゴリズムは終了します。距離は、M< = Mステップで割り切れる数に達するでしょう。

したがって、ループに遅いポインタを取得し、次に満たすために高速と低速のポインタを取得するには、< = N + M < = 2Nステップをとり、それがO(N)で

あります

実際には、ループがあるときに遅いポインタがN-Mのステップでそれに到達するので、合計ステップ数は< = Nであることに注意すれば、ステップ数に厳しい制限を設けることができます。

2

nノードがある場合、低速ポインタは、高速ポインタが低速ポインタと一致するか、またはリストの終わりを検出する前に、nステップを超えて移動することが保証されていません。つまり、遅いポインタを進める作業をO(n)し、速いポインタをO(n)の約2倍進めることを意味します。したがって、アルゴリズム全体はO(n)である。

+0

スローポインタがnステップ以内で移動することが保証されるのはなぜですか? – user3740951

+1

サイクルがある場合、両方のポインタがサイクルに入ると、高速ポインタはすべての反復で1ステップずつ「キャッチアップ」します。 「追いつく」ために必要な距離は、サイクルの長さの最大であるため、遅いポインターは、速いポインターが追いつく前に、周りの周りに2周目を開始することはできません。 – user2357112

+0

ループが完了する前に遅いポインタが実際に追いつくという証拠をいくつか提出できますか? – user3740951

関連する問題