스킵 리스트

IT 위키
AlanTuring (토론 | 기여)님의 2025년 4월 5일 (토) 06:48 판 (새 문서: 스킵 리스트(skip list)는 정렬된 원소를 빠르게 탐색, 삽입, 삭제할 수 있도록 설계된 확률적 자료구조이다. 1989년 William Pugh가 제안하였으며, 연결 리스트(linked list)의 구조를 확장하여 이진 탐색 트리 수준의 효율성을 얻을 수 있도록 고안되었다. ==개요== 500x500픽셀 스킵 리스트는 여러 수준의 연결 리스트를 위로 확장한 구조를 가진...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

스킵 리스트(skip list)는 정렬된 원소를 빠르게 탐색, 삽입, 삭제할 수 있도록 설계된 확률적 자료구조이다. 1989년 William Pugh가 제안하였으며, 연결 리스트(linked list)의 구조를 확장하여 이진 탐색 트리 수준의 효율성을 얻을 수 있도록 고안되었다.

1 개요[편집 | 원본 편집]

스킵 리스트 구조도.png

스킵 리스트는 여러 수준의 연결 리스트를 위로 확장한 구조를 가진다. 기본 연결 리스트는 가장 하위 레벨에 존재하며, 그 위로 확률적으로 선택된 노드들만 포함하는 상위 레벨들이 존재한다. 각 노드는 자신이 속한 레벨의 다음 노드를 가리키는 포인터를 가진다. 탐색, 삽입, 삭제 등의 연산은 상위 레벨부터 내려가며 진행되어, 일반 연결 리스트보다 빠른 속도를 제공한다.

2 구조[편집 | 원본 편집]

스킵 리스트는 레벨(level)의 개념을 기반으로 구성된다.

  • Level 0: 전체 원소를 포함하는 기본 연결 리스트
  • Level 1 이상: 일정 확률(p, 일반적으로 1/2 또는 1/4)에 따라 무작위로 선택된 노드만 포함
  • Head node: 모든 레벨의 시작점을 포함하는 특수 노드

노드마다 여러 개의 포인터가 있으며, 자신의 레벨 수에 따라 상위 레벨까지 연결된다.

3 연산[편집 | 원본 편집]

  • 탐색
    • 최상위 레벨부터 오른쪽으로 이동하며, 목표 값을 초과하기 전까지 진행한 후, 아래로 내려가 다시 탐색을 반복한다.
  • 삽입
    • 삽입 위치를 찾은 후, 랜덤하게 레벨을 결정하고 해당 위치에 새 노드를 추가한다.
  • 삭제
    • 탐색을 통해 대상 노드를 찾고, 해당 노드를 포함한 모든 레벨에서 포인터를 조정하여 제거한다.

4 시간 복잡도[편집 | 원본 편집]

스킵 리스트는 다음과 같은 평균 시간 복잡도를 갖는다.

  • 탐색: O(log n)
  • 삽입: O(log n)
  • 삭제: O(log n)

최악의 경우 O(n)일 수 있으나, 확률적 구조 덕분에 평균적으로는 균형잡힌 이진 탐색 트리와 유사한 성능을 가진다.

5 예제[편집 | 원본 편집]

다음은 Python에서 간단한 스킵 리스트 노드 구조의 예시이다.

import random

class SkipNode:
    def __init__(self, key, level):
        self.key = key
        self.forward = [None] * (level + 1)

class SkipList:
    def __init__(self, max_level, p):
        self.max_level = max_level
        self.p = p
        self.header = SkipNode(None, max_level)
        self.level = 0

    def random_level(self):
        lvl = 0
        while random.random() < self.p and lvl < self.max_level:
            lvl += 1
        return lvl

6 장점[편집 | 원본 편집]

  • 간단한 구현으로도 이진 탐색 트리 수준의 성능 달성
  • 포인터 조작만으로 동적 삽입, 삭제에 용이
  • 동시성 제어가 상대적으로 쉬움 (Lock-free skip list 구현 등)

7 단점[편집 | 원본 편집]

  • 공간 사용량 증가 (다수의 포인터 필요)
  • 성능이 확률에 의존함

8 같이 보기[편집 | 원본 편집]

9 참고 문헌[편집 | 원본 편집]

  • William Pugh (1990). "Skip Lists: A Probabilistic Alternative to Balanced Trees". Communications of the ACM.
  • Cormen, T. H., Leiserson, C. E., Rivest, R. L., and Stein, C. (2009). Introduction to Algorithms. MIT Press.