607 단어
3 분
브렌트 알고리즘(사이클 탐지 알고리즘)

개요#

브렌트 알고리즘은 Richard P. Brent가 토끼와 거북이 알고리즘같은 사이클 탐지 알고리즘을 개선하기 위해 고안한 알고리즘입니다.

브렌트 알고리즘은 기존 플로이드의 토끼와 거북이 알고리즘과 비교해 실행시간이 24%~36%나 더 빠른 성질을 가지고 있습니다.

이 알고리즘 또한 토끼와 거북이 알고리즘처럼 두 개의 포인터를 사용하고 사이클의 시작점과 길이를 모두 찾을 수 있습니다.

토끼와 거북이 알고리즘과 다르게 브렌트 알고리즘은 탐색범위를 늘려 평균적으로 더 빠르게 탐색을 실시합니다.

동작 원리#

브렌트 알고리즘은 토끼와 거북이라는 포인터와 power(탐색 범위)와 len이라는 현재 단계의 이동 횟수 변수를 사용합니다.

토끼는 시작점에서 한 칸 건너간 곳에서 출발하고 거북이는 시작점에서 출발, power와 len은 1의 값을 가지고 시작합니다.

이후로는 아래의 과정을 충돌이 발생하거나 토끼가 리스트의 끝에 도달할 때까지 반복합니다.

  1. 토끼가 거북이가 충돌하는가?
  2. len이 power와 같은가?
    1. 같다면
      1. 거북이를 현재 토끼 위치로 재설정
      2. power를 2배 증가
      3. len을 0으로 리셋
  3. 토끼 한 칸 증가
  4. 길이 1 증가

만약 리스트의 끝에 도달하면 사이클이 존재하지 않는 것입니다.

충돌이 발생할 경우 len 값이 사이클의 길이입니다.

예시로는 아래 그림과 같은 경우가 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

이렇게 사이클의 존재를 찾은 뒤에는 시작점도 탐색할 수 있습니다.

시작점을 탐색할 땐 거북이를 다시 출발점으로 보내고 사이클 길이만큼 토끼를 앞으로 이동시킵니다.

19

그 후 거북이와 토끼를 한 칸씩 이동시키며 만나는 지점을 찾고 이 때의 이동횟수가 출발점부터 사이클 시작점까지의 거리입니다.

20 21 22 23

참고 자료#