1. 程式人生 > >Floyd判圈演算法及其證明

Floyd判圈演算法及其證明

Floyd判圈演算法(龜兔賽跑演算法)可用於判定連結串列、迭代函式、有限狀態機是否有環。如果有環,可以找出環的起點和大小。

首先,讓我們確認一個事實:兩個人在環形跑道上同向而行,一前一後,速度不等,則快的那個一定能追上慢的那個。
設兩人相距x,跑道周長為C,令快者的速率(2v)等於慢者(v)的兩倍,則追及時間t=x2vv=xv,由於vt=xC,從開始計時到第一次相遇,慢者至多跑一圈。

令兩個指標t、h指向連結串列頭,稱t為慢指標,一次走一步,h為快指標,一次走兩步。如果h碰到連結串列尾,說明無環;如果某時刻兩者相遇,說明有環。

以環的起點為原點建立座標系,設兩者在y處相遇,連結串列頭座標為

L,圈的大小為C,t的路程為x,那麼相遇的時刻有

yL+xL+2x(modC)
可得
x0(modC)y+L0(modC)
這意味著自相遇處再走L步,到的地方是環的起點。

能不能據此找出環的起點?似乎陷入了死迴圈——知道起點在哪裡,我們才能得到L的大小。
解決方法是讓一個指標(比如說t)從y出發,另一個指標(h)從L處出發,兩者速率相等。L步之後,它們同時到達環的起點。
L步之前,t在環上,h在環外,兩者不可能相遇,於是,至少L步兩者才能相遇。而我們已經論證了第L步兩者必同在環的起點,因此,在環起點的那次相遇是兩者的初遇,第一次相遇處是環的起點。

此演算法的時間複雜度是O

(n),空間複雜度是O(1)n是連結串列長度。因為慢指標踏上環後,至多走一圈碰上快指標,所以慢指標的總路程不超過2n

總結:讓指標t、h從連結串列頭出發,每次t走一步,h走兩步,存在環當且僅當兩者相遇。t停留在相遇處,h回到連結串列頭,每次t走一步,h走一步,第一次相遇處為環的起點。t停留在相遇處,h前進,到再次相遇時走的步數為環的大小。

相關推薦

Floyd演算法及其證明

Floyd判圈演算法(龜兔賽跑演算法)可用於判定連結串列、迭代函式、有限狀態機是否有環。如果有環,可以找出環的起點和大小。 首先,讓我們確認一個事實:兩個人在環形跑道上同向而行,一前一後,速度不等,則快的那個一定能追上慢的那個。 設兩人相距x,跑道周長為C,

Floyd演算法(龜兔賽跑演算法, Floyd's cycle detection)及其證明

問題:如何檢測一個連結串列是否有環(迴圈節),如果有,那麼如何確定環的起點以及環的長度。 空間要求:不能儲存所經過的的每一個點。 舉例:x0=1x0=1,xi+1=f(xi)xi+1=f(xi),求

Floyd演算法(龜兔賽跑演算法

一、演算法簡述 Floyd判圈演算法(Floyd Cycle Detection Algorithm),又稱龜兔賽跑演算法(Tortoise and Hare Algorithm),是一個可以在有限

Floyd演算法(龜兔賽跑演算法)記錄

前言 這是在做 142. 環形連結串列 II 時看到的演算法,在這裡記錄,方便以後複習和學習; Floyd判圈演算法(Floyd Cycle Detection Algorithm),又稱龜兔賽跑演算法(Tortoise and Hare Algori

Floyd演算法(判斷是否有環)

用於判斷是否存在環,求解環的起點,求解環的周長 時間複雜度:O(n) 演算法原理:龜兔解法的基本思想可以用我們跑步的例子來解釋,如果兩個人同時出發,如果賽道有環,那麼快的一方總能追上慢的一方。進一步想,追上時快的一方肯定比慢的一方多跑了幾圈,即多跑的路的長度是圈的長度的

龜兔賽跑演算法Floyd演算法

參考資料: 1. 維基百科 https://zh.wikipedia.org/w/index.php?title=Floyd判圈演算法&redirect=no 2. http://blog.c

11549 Calculator Conundrum (迴圈節)(Floyd演算法,快慢指標)

Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with the following time waster.

Floyd演算法 leetcode 202題Happy Number

今天,日常刷leetcode,遇到202問題如下:Write an algorithm to determine if a number is "happy".A happy number is a number defined by the following proces

Cycle detection——Floyd演算法

Cycle detection 作者:money 標籤:leetcode,algorithm,Floyd’s cycle-finding algorithm,floyd判圈演算法 問題描述 對於一個函式f,他能將有限集合S對映到自身,對於起始數值X0

Floyd算法(判斷鏈表是否含環)

鏈表是否有環 als 龜兔賽跑算法 code 狀態 如果 inline span -s Floyd判圈算法 簡介 Floyd判圈算法,也稱龜兔賽跑算法,可用於判斷鏈表、叠代函數、有限狀態機是否有環。如果有,找出環的起點和大小。時間復雜度O(n),空間復雜度O(1)。 可以先

演算法(Flyod、Brent's)

問題 如何檢測一個連結串列是否有環?如果有環,如何確定環的起點以及長度? Floyd cycle detection(龜兔演算法) 龜兔賽跑 對於賽道來說,如果賽道中有環,那麼速度快的兔子一定會在某個地點追上烏龜,並且兔子所跑的距離減去烏龜所跑的

弗洛伊德演算法

Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. As

【Math】向上取整演算法及其證明

1.問題 A,B都是整數並且A>1,B>1 求┌A/B┐即A/B的上取整。 當A/B整除,往上取整返回值為A/B。 當不整除,返回值是int(A/B)+1 2.演算法 (A+B-1)/B 3.演算法證明 由於A>

最小費用流負環消演算法(poj2175)

The City has a number of municipal buildings and a number of fallout shelters that were build specially to hide municipal workers in case of a nuclear war

擴展gcd求解二元不定方程及其證明

std iostream 不定 article include %d content 及其 變形 #include <cstdio> #include <iostream> using namespace std; /*擴展gcd證明 由於當

HDU3342有向圖DFS&&拓撲排序法

ble 成了 target href tar -- targe space 排序 HDU3342 Legal or Not 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 題目意思:一群大牛互相問問題,大牛有不會的,會

圖論初步-Tarjan演算法及其應用

暑假刷了一堆Tarjan題到頭來還是忘得差不多。 這篇部落格權當複習吧。 一些定義 無向圖 割頂與橋 (劃重點) 圖G是連通圖,刪除一個點表示刪除此點以及所有與其相連的邊。 若刪除某點u後G不再連通,那麼u是G的一個割頂(割點)。 若刪除某邊e後G不再連通,那麼e是G的一個橋。 雙連通 一個圖為雙

資料結構(二):演算法及其描述

一、演算法及其描述 1、什麼是演算法 資料元素之間的關係有邏輯關係和物理關係,對應的操作有邏輯結構上的操作功能和具體儲存結構上的操作實現。 把 具體儲存結構上的操作實現方法 稱為演算法。 確切地說,演算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一

遞迴_CH0303_遞迴實現排列型列舉_遞迴演算法正確性證明範例

點此開啟題目頁面 先給出AC程式碼, 然後給出程式正確性的形式化證明. //CH0303_遞迴實現排列型列舉 #include <iostream> #include <cstdio> #include <vector> using namespace

遞迴_CH0302_遞迴實現組合型列舉_遞迴演算法正確性證明範例

點此開啟題目頁面 先給出AC程式碼, 然後給出程式正確性的形式化證明 //CH0302_遞迴實現組合型列舉 #include <iostream> #include <cstdio> #include <vector> using namespace