본문 바로가기
CS/자료구조

[자료구조] Circularly Linked List

by 개발도사(진) 2023. 9. 5.

2호선 내선순환선처럼, 'Circularly' 라는 표현 그대로 element들이 시작과 끝 지점이 없이 서로가 서로에게 연결되어 있는 자료구조이다. 즉, tail.next = head이다. 

게임개발을 하면서, 오브젝트 풀링을 통해 생성해 둔 오브젝트들을 게임이 진행됨에 따라서 꾸준히 스폰해 줘야 할 일이 있었는데, 나는 이 때 array+index 를 활용했다. 즉 간략하게 쓰자면

void LocateObstacles(Vector3 targetPos)
{
    _obstaclesArr[_obstacleIdx].SetActive(true);
    _obstacleArr[_obstacleIdx].transform.position = targetPos;
    
    _obstacleIdx++;
    if(_obstacleIdx>=_obstaclesArr.Length())
    {
    	_obstacleIdx = 0;
    }
}

이런 류의 method를 만들어서 사용했었다. 그래서 Circularly Linked List를 처음 봤을 때 이 자료구조가 굳이 필요한지 의문을 가졌었다. 반복해서 순회해야 한다면, 인덱스만 잘 움직여 주면 되는 것 아닌가? 하는 생각이 들었기 때문이다.

 

교재의 설명에 따르면 Circularly Linked List는 OS가 round-robin scheduling을 할 때 사용된다고 한다. 후에 OS 관련해서도 따로 자세히 공부하고 포스팅을 해야겠지만 round-robin scheduling은 OS가 여러 task들을 일정 time-slice만큼 잘게 쪼개서 수행하는 것인데, 전통적인 List로 해당 알고리즘을 구현하는 것보다 Circularly Linked List를 사용하는 것이 더 효율적이다. 전통적인 List를 이용한 round-robin scheduling은 removeFirst -> 해당 process를 time slice만큼 수행 -> addLast의 순서로 이루어지는데, 아래 설명하는 Circularly Linked List의 방식으로 비효율성을 개선할 수 있다. 

 

Circularly Linked List는 tail을 tail.next로 한 칸 미루고, 새로운 tail의 next가 새로운 head가 되게 할 수 있다. 이를 rotate 연산이라 하고, O(1) 시간에 수행되기 때문에 round-robin scheduling을 하는 데 더 효율적이다. 즉, Circularly Linked List를 사용한 round-robin scheduling은 time slice만큼 수행 -> rotate() 를 반복하는 방식으로 구현된다.


'CS > 자료구조' 카테고리의 다른 글

[자료구조] Queue  (0) 2023.09.13
[자료구조] Stack  (0) 2023.09.11
[자료구조] Doubly Linked List  (0) 2023.09.04
[자료구조] Singly Linked List  (0) 2023.07.29
[자료구조] 배열(Array)  (0) 2023.07.26