1. 程式人生 > >Cycle detection——Floyd判圈演算法

Cycle detection——Floyd判圈演算法

Cycle detection

作者:money
標籤:leetcode,algorithm,Floyd’s cycle-finding algorithm,floyd判圈演算法

問題描述

對於一個函式f,他能將有限集合S對映到自身,對於起始數值X0S,我們有XnS

x0,x1=f(x0),x2=f(x1),...,xn=f(xn1)

當第ijij出現xi=xj,並且後續的序列xixj1出現重複,則序列存在迴圈。
例如序列:
1,2,3,4,5,6,4,5,6,4,5,6......
在例如狀態轉移圖:
image

S=0,1,2,3,4,5,6,7,8
存在以下狀態迴圈:
2

,0,6,3,1,6,3,1,6,3,1,....
迴圈圈(cycle)為6,3,1

迴圈圈判斷演算法——Floyd’s cycle-finding algorithm

我們設定兩個指標slow,faster,在序列中已不同速度進行移動。去判斷是否存在迴圈圈。

image

關鍵環節:
對於任意整數iμ 並且k0xi=xi+kλλ為迴圈圈大小,μ是迴圈圈第一個元素,當i=kλμ,我們有xi=x2i。因此我們讓slow以1步,faster以2步去檢索序列即可發現一個週期v,這個vλ的整數倍,使得我們slow指標和faster指標所指向的內容相同。
我們有以下問題:

1、判斷是否存在迴圈圈

slow指標以1步前進,faster指標已兩步前進,如存在迴圈必然存在xi=x2i,其中i=kλ,我們可以計算迴圈圈的特點和我們什麼時候會找到迴圈圈:
這裡寫圖片描述

根據上圖,我們有:
i=p+sλ+r
2i=p+fλ+r
r=p+(f2s)λ
我們要求0<r<λf2s0
所以有(f2s)λ>P,即當非迴圈段長度P很大時,我們的slow指標可能會經過很多個迴圈,此時我們v=fastslow=kλ,其中k>0

2、找到迴圈起始點μ及最短週期

根據上述情況,我們在迴圈中的第r個元素,找到的迴圈週期v=fastslow=kλr不是迴圈其實μv並不是最小週期,此時我們需找到迴圈其實點μ

及最小週期λ
求μ:
因為我們知道v是週期,我們從頭開始遍歷序列,設定兩個指標prt1prt2,其中prt2=prt1+v,當prt1指向μ時,prt2就指向k個迴圈後的μ,值相等。這樣就找到了週期的其實序列μ;

找到μ後,我們找下一個等於μ的值,其中的長度就是最小週期λ
此處注意問題的定義,因為是xn+1=f(x

相關推薦

Cycle detection——Floyd演算法

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

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演算法及其證明

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

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

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

Floyd's Cycle Detection Algorithm

Floyd判圈演算法 1. 什麼是Floyd判圈演算法? Floyd判圈演算法(Floyd Cycle Detection Algorithm),又稱龜兔賽跑演算法(Tortoise and Hare Algorithm),是一個可以在有限狀態機、迭代函式或者連結串列上判斷是否

最小費用流負環消演算法(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

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

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

floyd 最小環

每次列舉k時,列舉所有編號小於k的結點i,j(i≠j≠k),可以得出一個經過i,j,k的可行環:a[i][k]+a[k][j]+dist[i][j],即i到j的最短路加上i到k、j到k的直接距離(若兩點之間沒有邊則為∞)。可以證明,若i到j的最短路經過k,則這

3259 (floyd負環||spfa負環||bellman_ford負環)

傳送門 題解:第一種使用floyd判負環,只需要在演算法過程多一個判讀dp[i][i]是否為負數即可。 附上程式碼: #include<iostream> #include<cstdio> #include<cstring> us

資料結構-基於鄰接矩陣實現圖的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)

使用 JavaScript 基於鄰接矩陣實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。一、輸入首先,輸入資料主要有兩個,一個是存放節點名的陣列,另一個是存放邊物件的陣列。例如://存放圖結點的陣列 va

資料結構-基於鄰接表實現圖的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)

使用 JavaScript 基於鄰接表實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。<!DOCTYPE html> <html lang="en"> <head>

最短路演算法詳解(Dijkstra/Floyd/SPFA/A*演算法

最短路徑 在一個無權的圖中,若從一個頂點到另一個頂點存在著一條路徑,則稱該路徑長度為該路徑上所經過的邊的數目,它等於該路徑上的頂點數減1。由於從一個頂點到另一個頂點可能存在著多條路徑,每條路徑上所經過的邊數可能不同,即路徑長度不同,把路徑長度最短(即經過的邊數最少)的那