플로이드 사이클 감지 알고리즘 | 사이클 시작점 결정


32

Floyd의주기 감지 알고리즘을 이해하는 데 도움을 요청하고 있습니다. wikipedia에 대한 설명을 살펴 보았습니다 ( http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare )

알고리즘이 O (n) 시간의 사이클을 어떻게 감지하는지 알 수 있습니다. 그러나 거북이와 토끼 포인터가 처음 만나면 거북이 포인터를 다시 시작으로 이동 한 다음 한 번에 거북이와 토끼를 한 단계 씩 움직여주기 시작을 결정할 수는 없습니다. 그들이 처음 만나는 지점은 사이클의 시작입니다.

누군가 이해하고 시각화 할 수 없기 때문에 위키 백과의 설명과는 다른 설명을 제공하여 도움을 줄 수 있습니까?


3
stackoverflow에서 답을 찾았습니다. 누군가 나를 위해 이것을 찾고 있다면 감사합니다. 그리고 나를 좋아하는 사람들은 설명을 원한다. stackoverflow.com/questions/3952805/… 질문에 대한 선택된 답변이 그것을 설명한다!
Anurag Kapur

안녕하세요 @Anurag. 귀하의 정보를 위해, 여기
Kyle

fast변수 또는 "헤어"가 단지 앞쪽이 아닌 거북이의 두 배 속도로 이동해야하는 이유를 알고 있습니까?
devdropper87

답변:


47

"단일로 연결된 목록에서 루프 시작 감지" 를 참조 할 수 있습니다 ( 발췌 내용은 다음과 같습니다).

여기에 이미지 설명을 입력하십시오

slowPointer회의 전 이동 거리 =x+y

fastPointer만나기 전에 이동 한 거리 = x + 2y + z=(x+y+z)+y

이후 fastPointer에 여행 이중 의 속도 slowPointer시간 일정 을 모두 할 때 손이 닿지 회의 포인트. 따라서 간단한 속도, 시간 및 거리 관계를 사용하여 ( slowPointer거리의 절반 이동) :

2dist(slowPointer)=dist(fastPointer)2(x+y)=x+2y+z2x+2y=x+2y+zx=z

따라서 이동하여 slowPointer링크리스트의 시작, 모두 제작 slowPointer하고 fastPointer한 번에 하나 개의 노드를 이동, 그들은 모두 커버 동일한 거리를 가지고 .

링크 된 목록에서 루프가 시작되는 지점에 도달합니다.


2
여기서 당신은 그들이 한 번의 회전 후에 만날 것이라고 가정했습니다. 특정 번호 이후에 만날 수있는 경우 (사이클이 작은 경우)가있을 ​​수 있습니다. 회전.
Navjot Waraich

1
@JotWaraich 이미지가 모든 경우를 대표하는 것은 아닙니다. 논리는 그러나 여전히 보유
denis631

3
이것은 전체 인터넷에서이 알고리즘에 대한 가장 직접적인 대답입니다
Marshall X

7

나는 받아 들여진 대답을 다른 곳에서도 증거로 보았습니다. 그러나 쉽게 이해하기 쉽지만 올바르지 않습니다. 그것이 증명하는 것은

x=z (이것은 분명히 틀리며 다이어그램은 스케치 된 방식으로 인해 그럴듯 해 보입니다).

당신이 정말로 증명하고 싶은 것은 (위의 허용 된 답변의 다이어그램에 설명 된 것과 동일한 변수를 사용하는 것)입니다.

z=x mod (y+z)

(y+z) 는 루프 길이L

우리가 증명하고 싶은 것은 :

z=x mod L

또는 z는 x (모듈로 L)와 일치합니다.

다음과 같은 증거가 더 의미가 있습니다.

미팅 포인트,M=x+y

2(x+y)=M+kL . 여기서 는 일정합니다. 기본적으로 빠른 포인터로 이동 한 거리는 + 루프 길이의 배수 배수kx+yL

x+y=kL

x=kLy

위의 방정식은 가 루프 길이의 배수 인 빼기 와 동일 하다는 것을 증명합니다 . 따라서 빠른 포인터가 미팅 포인트, 또는 에서 시작하면 루프 시작시 끝납니다.xLyMx+y


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.