독일어 원문 제목: 4. Probabilistische Datenstrukturen (4 Punkte)
4번 · 확률적 자료구조 스킵 리스트(Skip List)
완전 초보자를 위한 구조 읽기 → 위치 찾기 → 난수 승격 → 검색 경로 → 검산
복기 원문을 구조적으로 다시 그린 초기 스킵 리스트
다음/이전(next/prev) 양방향 포인터아래/위(down/up) 탑 연결
선행지식 없이 시작
이 페이지를 읽는 순서
연결 리스트와 확률을 배우지 않은 학습자가 한 페이지에서 Skip List의 node, tower, level, pointer를 읽고 삽입과 검색 경로를 직접 그릴 수 있도록 구성했습니다. 먼저 정렬된 지하철 노선 비유로 구조를 읽고, 작은 tower 예제, 실제 난수 소비, 색칠된 search overlay 순서로 학습합니다.
tower를 세로로 읽기
같은 key가 여러 level에 있으면 하나의 tower입니다. 아래 Level 0에는 모든 key가 있고 위로 갈수록 일부 key만 남는다는 구조 불변식을 먼저 확인합니다.
오른쪽·아래 규칙 익히기
항상 최고 head에서 시작합니다. next가 목표 이하이면 오른쪽, 목표를 넘거나 next가 없으면 아래로 간다는 한 규칙으로 검색 위치와 삽입 predecessor를 찾습니다.
난수는 첫 실패까지만
Level 0 삽입은 확정이고 난수는 그 위 복사본부터 결정합니다. \(r<p\)r<p인 동안 한 level씩 올리고 첫 \(r\ge p\)r≥p에서 즉시 멈춰 미사용 난수를 보존합니다.
그림으로 검산하기
모든 row가 정렬됐는지, 위 node가 아래 모든 level에 이어지는지, 사용 난수와 search edge가 규칙에 맞는지 체크한 뒤 힌트 문제를 풉니다.
먼저 익힐 기호와 용어
항목 (Level 0 (L0))
모든 실제 key가 빠짐없이 있는 가장 아래의 완전한 정렬 리스트입니다.
이 페이지의 예: 초기 L0: −∞,13,21,47,66,95
항목 (−∞ / head)
모든 key보다 작은 sentinel node이며 각 level의 탐색 시작점입니다. 실제 저장 key가 아닙니다.
이 페이지의 예: 검색은 −∞@L2에서 시작
항목 (tower)
같은 key의 node가 Level 0부터 어떤 최고 level까지 수직으로 연결된 묶음입니다.
이 페이지의 예: 초기 key 47은 L0,L1,L2의 세 node
항목 (next / down)
next는 같은 level에서 오른쪽 node, down은 같은 tower의 바로 아래 node를 가리키는 pointer입니다.
이 페이지의 예: 47@L1.down=47@L0
빈 포인터 (nil)
더 이동할 node가 없음을 나타내는 값입니다. L0에서 \(\text{down}=\text{nil}\)down=nil이 되면 검색 실패입니다.
이 페이지의 예: 13@L0에서 \(\text{down}=\text{nil}\)down=nil
항목 (p, r)
p는 승격 확률, r은 [0,1)에서 받은 난수입니다. 이 페이지의 규칙은 \(r<p\)r<p이면 한 층 승격입니다.
이 페이지의 예:\(0.15<0.33\)0.15<0.33이므로 67을 L1에 추가
정확성 범위
문제 문언, 초기 그림, p와 난수열은 SoSe 2025 시험 기억 복기(reconstructed) 자료이며 공식 시험지나 공식 답안이 아닙니다. 구조·검색·삽입 알고리즘은 SoSe 2026 현재 강의로 검증했고, ‘난수가 p보다 작으면 승격’ 규칙과 유사 연산은 공식 Übung Sheet08 해설로 교차 확인했습니다. 그림의 정답은 이 명시된 난수 convention과 누적 상태 \(4(a)\to 4(b)\to 4(c)\)4(a)→4(b)→4(c)를 전제로 합니다.
삽입·검색 전체 의사코드(pseudocode)
아래 규칙을 먼저 고정해야 같은 난수와 구조에서 같은 답을 재현할 수 있습니다.
삽입(insert)
search from top head and store predecessor update[level]
insert key after update[0] on Level 0 and repair next/prev
below = the new Level-0 node
level = 1
while next random r < p:
if level > maxLevel:
create newHead; newHead.down = oldTopHead; oldTopHead.up = newHead
topHead = new head; maxLevel = level; update[level] = new head
copy = insert key after update[level] and repair next/prev
copy.down = below; below.up = copy; below = copy
level = level+1
stop immediately at the first r >= p
검색(search)
current = top head
while current != nil:
if current.key == target: return current
if current.next != nil and current.next.key <= target:
current = current.next
else:
current = current.down
return nil
배점: 1점
4(a) · 67 삽입 — 검색 위치와 확률적 탑(tower) 높이를 분리해서 계산하기
\(p=0.33\)p=0.33인 초기 Skip List에 67을 삽입한다. 난수 0.15, 0.80, 0.61, 0.72, 0.82, 0.25, 0.83을 왼쪽부터 필요만큼 사용한다.
이 절은 다른 소문제를 펼치지 않아도 시작 구조, 용어, 작은 예제, 실제 풀이, 검산을 모두 확인할 수 있습니다.
먼저 문제의 정체부터 파악하기
Skip List 삽입은 두 작업의 결합입니다. 먼저 일반 정렬 리스트처럼 Level 0에서 key가 들어갈 위치를 찾고, 그다음 난수를 하나씩 소비해 같은 key의 복사본을 위층에 더 만들지 결정합니다.
확률 \(p=0.33\)p=0.33은 '난수가 0.33보다 작으면 승격'으로 사용합니다. 첫 실패가 나오면 즉시 멈추며 뒤의 난수는 사용하지 않습니다. Level 0 삽입 자체에는 난수가 필요 없습니다.
67은 66과 95 사이에 들어갑니다. 첫 난수 \(0.15<0.33\)0.15<0.33이므로 Level 1에도 67을 만들고, 다음 \(0.80\ge 0.33\)0.80≥0.33이므로 Level 2에는 만들지 않습니다.
4(a) 풀이 시작 구조
다음/이전(next/prev) 양방향 포인터아래/위(down/up) 탑 연결
이 소문제만 읽어도 풀 수 있는 초보자 강의
무엇을 배우고 왜 필요한가
Skip List 삽입은 정렬 위치를 찾는 결정적 단계와 tower 높이를 정하는 확률적 단계를 분리해야 합니다. 이 문제는 Level 0은 반드시 삽입하고, 위 level만 난수로 결정한다는 가장 중요한 규칙을 짧은 trace로 연습합니다.
최고 level부터 search 규칙을 따라 각 level의 predecessor update 값을 찾을 수 있습니다.
전체 난수열에서 실제 사용한 값만 구분하고 첫 실패 뒤 값은 읽지 않을 수 있습니다.
67의 L0·L1 node를 수직으로 연결하고 모든 level의 정렬 순서를 검산할 수 있습니다.
풀이 전에 알아둘 용어
시작 표식 노드(sentinel head) −∞
각 층(level) 맨 왼쪽의 시작 노드입니다. 모든 실제 키보다 작다고 약속해 첫 키 앞 삽입과 검색을 같은 규칙으로 처리합니다.
아주 작은 예: 2층의 −∞.next는 초기에는 47입니다.
바로 앞 노드(predecessor) update[level]
새 키보다 작으면서 그 층에서 가장 오른쪽에 있는 노드입니다. 새 노드는 이 바로 앞 노드와 기존 다음 노드(next) 사이에 연결됩니다.
아주 작은 예: 0층에서 \(66<67<95\)66<67<95이므로 \(\text{update}[0]=66\)update[0]=66입니다.
탑(tower) 연속성
키가 h층에 있다면 같은 키가 0층부터 h층까지 모든 아래 층에 있어야 합니다. 중간 층을 건너뛴 복사본은 허용하지 않습니다.
아주 작은 예: 67이 1층에 있으면 반드시 67@L1.down=67@L0입니다.
승격 사건 \(r<p\)r<p
L0 삽입 뒤 난수 r이 p보다 작을 때만 바로 위 level에 복사본을 만듭니다. 성공하면 다음 난수를 읽고 실패하면 종료합니다.
아주 작은 예:\(0.15<0.33\)0.15<0.33성공, 다음 \(0.80\ge 0.33\)0.80≥0.33실패입니다.
비유로 이해하기 · 일반선 역을 만든 뒤 급행 정차 여부 추첨
67번 역은 번호 순서 때문에 일반선의 66과 95 사이에 반드시 생깁니다. 그다음 추첨에 성공하면 같은 67번 역을 급행선에도 만들고, 다시 성공하면 특급선에도 만듭니다. 첫 실패가 나오면 공사를 멈춥니다.
모든 역이 있는 일반선↔모든 key가 있는 Level 0
급행·특급 정차역↔위 level의 key 복사 node
역 번호 순서↔각 level의 key 오름차순
첫 탈락에서 추첨 종료↔첫 \(r\ge p\)r≥p뒤 난수 미사용
비유가 설명하지 못하는 부분: 위 level의 역은 독립된 새 key가 아니라 아래 같은 key와 down/up pointer로 연결된 복사 node입니다. 따라서 row만 그리지 말고 tower의 수직 링크도 표시해야 합니다.
67 삽입의 다섯 장면
① 삽입 위치 검색(search)L2의 47까지 오른쪽, L1 47로 아래, L0 66까지 이동합니다.
② 0층 삽입(insert)66.next를 67로, 67.next를 95로 연결합니다.
\(③ r=0.15\)③ r=0.15\(0.15<0.33\)0.15<0.33이라 L1의 47과 95 사이에 67 복사본을 둡니다.
④ 수직 연결(vertical link)67@L1.down을 67@L0에 연결해 연속된 탑을 만듭니다.
Level 0에 넣은 뒤 첫 난수로 Level 1 승격 여부를 결정합니다. 성공하면 다음 난수로 Level 2를 결정하고, 실패하면 그 즉시 tower 생성이 끝납니다.
여기서는 \(0.15<0.33\)0.15<0.33이 성공, \(0.80\ge 0.33\)0.80≥0.33이 실패입니다. 그러므로 67의 tower 높이는 최고 Level 1입니다.
머릿속 그림: 동전을 던져 성공할 때마다 한 층 올라가고 첫 실패에서 엘리베이터가 멈춥니다.
\[0.15<p\Longrightarrow\text{1층으로 승격}\]
\[0.80\ge p\Longrightarrow\text{2층 전에 중단}\]
3단계 · 기대 성능
각 키(key)가 i층까지 올라갈 확률은 p의 i제곱이므로 기대 층 크기는 \(n,\text{pn},p^{2}n\)n,pn,p²n처럼 줄어듭니다. 이 기하급수 감소가 평균 높이와 탐색 시간을 \(\Theta(\log_{1/p} n)\)Θ(log₁/p} n)으로 만듭니다.
한 번의 구체적 삽입 결과는 난수에 따라 달라도, 많은 실행의 평균에서는 높은 탑(tower)이 드물게 나타납니다.
머릿속 그림: 높은 층으로 갈수록 통과해야 할 추첨이 많아져 사람 수가 빠르게 줄어듭니다.
head의 \(\text{next}=19\)next=19가 18보다 큽니다. 오른쪽으로 가면 목표를 넘으므로 −∞@L2에서 −∞@L1로 내려갑니다.
L0에서는 왜 13까지 오른쪽으로 가나?
\(\text{next}=13\le 18\)next=13≤18이라 안전합니다. 그 다음 \(\text{next}=19\)next=19는 18보다 커서 이동하지 않고 13@L0에서 아래를 선택합니다.
search(18)의 실패를 무엇으로 확정하나?
13과 19 사이에 18 node가 없고 13@\(L0.\text{down}=\text{nil}\)L0.down=nil이라 더 탐색할 level이 없습니다. 따라서 \(\text{current}=\text{nil}\)current=nil로 종료해 NOT FOUND입니다.
\(67>66\)67>66이라 목표를 지나치므로 blocked comparison으로만 표시합니다. 47@L1에서 47@L0로 내려간 뒤 \(\text{next}=66\)next=66으로 이동해 FOUND입니다.
검색 경로를 한 칸씩 실제로 따라가기
검색(search(18)) · 없음(NOT FOUND)
−∞@L2↓−∞@L1↓−∞@L0→13@L0↓ nil
19가 18보다 커서 상위 두 Level에서 즉시 내려가고, L0에서 13 다음 19가 너무 커 실패합니다.
검색(search(18))의 실제 이동과 막힌 비교
다음/이전(next/prev) 양방향 포인터아래/위(down/up) 탑 연결실제 검색 이동비교했지만 이동하지 않은 노드
검색(search(66)) · 찾음(FOUND)
−∞@L2→19@L2→47@L2↓47@L1↓47@L0→66@L0
L2에서 47까지 이동하고 L1의 next 67을 넘지 않도록 내려가 L0에서 66을 찾습니다.
검색(search(66))의 실제 이동과 막힌 비교
다음/이전(next/prev) 양방향 포인터아래/위(down/up) 탑 연결실제 검색 이동비교했지만 이동하지 않은 노드
4(c) 결과 구조
다음/이전(next/prev) 양방향 포인터아래/위(down/up) 탑 연결
답이 맞는지 스스로 검산
경로의 첫 node가 최고 level의 −∞이고 모든 right edge는 도착 \(\text{key}\le \text{target}\)key≤target인지 확인합니다.
모든 down edge가 같은 key의 바로 아래 level로 이어지며 L2에서 L0로 중간 node를 건너뛰지 않는지 확인합니다.
18은 13 다음 19가 blocked이고 \(\text{down}=\text{nil}\)down=nil로 끝나며, 66은 \(\text{current}.\text{key}=66\)current.key==66에서 즉시 끝나는지 확인합니다.
overlay의 실선 화살표는 실제 이동, 빨간 점선은 비교했지만 이동하지 않은 next임을 구분합니다.
30초 자가점검
search(20)은 최종 구조에서 L2의 19 뒤 어디로 가나?
힌트: L2의 다음 47과 target 20을 비교하세요.
정답:\(47>20\)47>20이라 19@L2에서 19@L1로 내려가고, 다시 L0로 내려가 \(\text{next}=21>20\)next=21>20을 확인한 뒤 nil로 실패합니다.
next.key가 target과 같으면 right인가 down인가?
힌트: 조건은 <가 아니라 ≤입니다.
정답: right로 그 node에 이동하고 다음 loop의 equality 검사에서 FOUND를 반환합니다.
47@L2에서 바로 47@L0로 내려가도 경로 답이 맞나?
힌트: down pointer는 어느 level을 가리키는지 확인하세요.
정답: 아닙니다. down은 바로 아래 47@L1을 가리키므로 경로에 L1 node를 포함해야 합니다.
시험 답안 템플릿
18 검색: −∞₂↓−∞₁↓−∞₀→\(13₀\)13₀뒤 \(19>18\)19>18이므로 없음(NOT FOUND). 66 검색: −∞₂→19₂→47₂↓47₁↓\(47₀\to 66₀\)47₀→66₀에서 찾음(FOUND). 다음 키가 목표보다 크면 오른쪽으로 넘지 않고 아래로 간다.
초보자가 자주 틀리는 지점
검색을 Level 0에서 시작한다.
next.key가 목표보다 큰데도 오른쪽으로 이동한다.
18이 없다는 결론만 쓰고 실패 경로를 그리지 않는다.
L2의 47에서 L0로 한 번에 내려가 중간 tower node를 생략한다.
66 대신 상위 Level의 67로 이동했다가 되돌아온다. Skip List search는 뒤로 가지 않습니다.
4(b) 이전 구조에서 검색해 19·67 tower를 누락한다.
근거와 정확성 범위
복기 문언, 강의 정의, 공식 연습 풀이, 추가 유도를 구분해 표시합니다.
복기 시험 문언AuD Gedächtnisprotokoll SoSe 2025.md · lines 226-244 and linked image · 신뢰도/범위: 복기 문언·이미지이며 공식 답안 아님
초기 Skip List, p, 삽입 key, 난수열, 검색 target의 복기 문언
현재 강의 자료Vorlesung\05RandomizedDataStructures-wi.pdf · pp. 4-12 · 신뢰도/범위: 현재 강의 원문으로 검증
정렬 리스트, express level, head/node pointer 모델, search pseudocode, 기대 level 크기
현재 강의 자료Vorlesung\05RandomizedDataStructures-wi.pdf · pp. 16-20 · 신뢰도/범위: 현재 강의 원문으로 검증
삽입 predecessor 저장, 확률적 승격, 평균 검색·삽입·삭제 시간과 공간
공식 연습 풀이Übung\AuD26_Sheet08-Sol.pdf · pp. 8-10 · 신뢰도/범위: 공식 연습문제 풀이로 교차 검증
\(r<p\)r<p승격 convention, 첫 실패까지 난수 소비, 성공·실패 검색 path와 누적 삽입 예시