floyd判圈演算法

2022-05-08 17:33:12 字數 475 閱讀 8035

floyd判圈演算法又稱龜兔賽跑演算法

兩個指標\(p1,p2\)

\(p1\)每次向後跳一次

\(p2\)每次向後跳兩次

顯然,如果\(p1,p2\)相遇才有環

現在我們想求環長和環的起點.

設起點到環的距離為\(len\)

環的起點離相遇點距離\(rem\)

設兩個指標分別走了\(p,q\)步

那麼,\(p=len+rem+a*l, q=len+rem+b*l\)

又有\(2p=q\)

可以得到\(p=(a-b)l\)

說明了\(p,q\)是\(l\)的倍數

我們再把\(p\)挪回起點,\(p,q\)同時每次走一步,直到相遇

那麼\(q=2p+len\)

等於\(q\)從起點走了\(len\)步然後走了\(2(a-b)\)圈

所以\(p,q\)會在環的起點處相遇.

然後繼續跳即可求出環長.

Floyd判圈演算法

參考 判斷鍊錶中是否有環 大概就是說兩個指標首先都指向鍊錶的首部,然後乙個每次走一步,乙個每次走兩步,如果有環,那麼慢的肯定能夠追上快的,否則快的就會先到達終點。求環的長度 兩個指標重合時,快的停止,慢的每次走一步,計算圈的長度。求環的起點 if head null slowptr slowptr ...

Floyd判圈演算法

自 問題 如何檢測乙個鍊錶是否有環,如果有,那麼如何確定環的起點.龜兔解法的基本思想可以用我們跑步的例子來解釋,如果兩個人同時出發,如果賽道有環,那麼快的一方總能追上慢的一方。進一步想,追上時快的一方肯定比慢的一方多跑了幾圈,即多跑的路的長度是圈的長度的倍數。基於上面的想法,floyd用兩個指標,乙...

UVA 11549 floyd判圈演算法

題意 給乙個整數k,每次平方後只能顯示結果的前n位,問在這個過程中能得到的最大的數是多少 思路 floyd判圈演算法 它的正確性建立在這得到的這些數是有限的,所以一定是乙個迴圈,在這個迴圈的圈裡面,乙個快乙個慢,同時出發最後一定會再次相遇,此時結束 在這個過程中得到最大值 ac include in...