SlideShare a Scribd company logo
스킵리스트- Skip List
스킵리스트란 Log시간에 검색/추가/제거를 수행할 수 있는 정렬된 자료구조 이진검색트리를 대체할 수 있음 스킵 포인터를 사용해서 빠르게 탐색 가능 - 9호선 급행처럼 구현이 간단함! 레퍼런스 없이 Red-Black Tree를 1시간 안에 구현할 수 있나요?
스킵리스트는 젊다! 1960 1980 1970 1990 Treap [Aragon & Seidel] R Tree [Guttman]   AVL Tree [Avdelson- Velskii & Landis] RB Tree B Tree [Bayer] Splay Tree [Sleator & Tarjan] Skip List
아이디어 : 뛰어넘기 빠른 검색을 위해 한 칸씩 뛰어넘으면서 찾으면 어떨까? 메모리 : ½ N 만큼 더 사용 검색 : 최대 N/2 + 1 노드를 검사
아이디어 : 또 뛰어넘기 뛰어넘기 아이디어를 또 적용하면? 메모리 : ¾ N만큼 더 사용 속도 : 최대 N/4 + 3 노드를 검사
아이디어 : 계속 뛰어넘기 2i번째 노드는2i 개의 포인터를 가지도록 만들면? 메모리 : N 만큼 더 사용 속도 : O(log N) 개의 노드만을 검사 여기까진 이진검색트리랑 다를 게 없음
동적 데이터구조로서의 문제점 노드를 추가하거나 삭제하면 패턴이 무너지게 됨 다시 패턴을 만드는 데에는 O(N)이란 긴 시간이 필요함
스킵리스트: 확률적 자료구조 크기의 확률분포를 유지하기! 노드 중 ½은 포인터 1개를 가짐 노드 중 ¼은 포인터 2개를 가짐 노드 중 1/2i은 포인터 i개를 가짐 규칙적인 패턴을 유지할 필요가 없어짐 하지만 여전히 높은 확률로 Log N시간에 동작함 struct Node<T> {     T key;     Node<T> *forward[];};
스킵리스트 노드 크기의 분포는 앞서 보았던 리스트와 동일 다만 패턴이 다르게 나타남
매개변수 p i개의 포인터를 가진 노드가r 개라면pr개의 노드는i+1개의 포인터를 가짐 앞의 예제에서는 p = ½  p = ½일 때 가장 속도가 빠르다! 적당한 속도와 메모리 효율을 위해 p = ¼ 를 권장 포인터의 최대 개수는 log1𝑝𝑁개가 적당 대부분의 구현에서는 최대 개수를 20개 정도로 고정함  
노드 검색하기
노드 삽입하기 노드의 크기를 확률적으로 정함! 크기가 1이 될 확률은 (1-p) 크기가 2가 될 확률은 p(1-p) 크기가 3이 될 확률은 p2(1-p) …  p에 따른 노드 크기의 분포
노드 삽입하기 앞쪽 포인터를 갱신하게 위해 BackLook배열을 유지하면서 탐색
노드 제거하기 같은 방식으로 BackLook배열을 유지하면서 탐색 제거하면서 앞뒤의 포인터를 이어줌 어차피 랜덤이므로 노드 크기의 분포 유지엔 영향이 없음
최악의 경우 O(N) 이 되지만 모든 노드의 크기가 같아지면 보통 리스트와 동일하게 됨. 하지만 길이 100짜리 리스트가 그렇게 될 확률은? 동전을 100번 던졌을 때 전부 앞면만 나올 확률 로또 1등먹을  확률! 검색시간이 기대값(Log N)의 3배 이상 걸릴 확률은 엄청나게 낮다!
메모리 사용량 비교 리스트 : 노드마다1개의 포인터 필요 이진검색트리: 노드마다2개의 포인터 필요 스킵리스트: 노드마다11−𝑝개의 포인터 필요 𝐸𝑋=𝑛=1∞𝑛𝑃(𝑋=𝑛)=𝑛=1∞𝑛𝑝𝑛−1(1−𝑝)=11−𝑝  
메모리 사용량 비교 p의 값에 따라 메모리 사용량을 타협할 수 있음 더 적은 메모리 만으로도 Log 시간에 검색 가능 노드당포인터 사용 이진트리 리스트 p
멀티스레드에서RB트리의 문제점 리밸런싱은 예측할 수 없지만 무겁다 – 재수없으면 망함 Thread Stall 락 락 락 락(리밸런싱) 락 락 락
스킵리스트는 병렬프로그래밍에 유리함 락이 길어질 확률은 매우 빠르게 작아지기 때문에 불규칙한 락 때문에 모든 스레드가 멈춰버릴 확률이 적다. 락을 포인터/노드별로로컬하게 걸 수 있어서 충돌의 위험이 더욱 작다. 하지만 Persistent하게 만들기는 트리보다 어렵다.
언제 스킵리스트를 쓸까? 멀티스레드에서 자주 수정할 컨테이너가 필요할 때 순차적으로 탐색할 필요가 많은 경우  예 : 타임라인상의 이벤트 관리 정렬할 필요가 없을 땐 해쉬테이블을 쓰는 것이 좋음 cache miss/fragmentation 등으로 인해 B-Tree보다 느리게 동작하는 경우도 있으므로 신중한 결정이 필요함
스킵리스트의 변형들 Indexed Skip List 엣지마다 길이를 저장해서 인덱스 접근이 가능 Deterministic Skip List 최악의 경우에도Log시간이지만 패턴 유지를 위한 비용이 필요함 1-2 skip list 바로 아래 레벨의 노드2개 이상을 지나가지 않도록 유지  2-3 tree 에 대응 1-2-3 skip list
스킵리스트 구현들 Redis (BSD) 스킵리스트를 이용한 key-value 저장 서버 (ANSI C) JAVA 1.6의 ConcurrentSkipListMap, Set 스킵리스트를 이용해 구현한 멀티스레드를 지원하는 map과 set Skipdb (BSD) B-Tree대신 스킵리스트를 사용해서 구현한 버클리DB 방식의 DB Qt의 Qmap (GPL, LGPL) Qt Framework중 GUI와 관계없는 기능을 모은 QtCore모듈에 있음 STL map과 유사한 방식으로 사용 가능
Reference Pugh, William (June 1990). "Skip lists: a probabilistic alternative to balanced trees". Pugh, William (July 1989). “A Skip List Cookbook”  Herlihy et. al. “A Probably Correct Concurrent Skip List” Fraser and Harris (2004). “Concurrent Programming Without Locks” Wikipedia : Skip List

More Related Content

What's hot

코로나19로 인해 변화된 우리 시대의 데이터 트랜드
코로나19로 인해 변화된 우리 시대의 데이터 트랜드코로나19로 인해 변화된 우리 시대의 데이터 트랜드
코로나19로 인해 변화된 우리 시대의 데이터 트랜드
Yongho Ha
 
ClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei MilovidovClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei Milovidov
Altinity Ltd
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
Seungmo Koo
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
iFunFactory Inc.
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
YEONG-CHEON YOU
 
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Databricks
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
NAVER D2
 
PostgreSQL, performance for queries with grouping
PostgreSQL, performance for queries with groupingPostgreSQL, performance for queries with grouping
PostgreSQL, performance for queries with grouping
Alexey Bashtanov
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
Heungsub Lee
 
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
StreamNative
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
NAVER D2
 
Sw occlusion culling
Sw occlusion cullingSw occlusion culling
Sw occlusion culling
YEONG-CHEON YOU
 
화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자
Yongho Ha
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
QooJuice
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
Seungmo Koo
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
YEONG-CHEON YOU
 
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
Taehoon Kim
 
High-speed Database Throughput Using Apache Arrow Flight SQL
High-speed Database Throughput Using Apache Arrow Flight SQLHigh-speed Database Throughput Using Apache Arrow Flight SQL
High-speed Database Throughput Using Apache Arrow Flight SQL
ScyllaDB
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
Seongyun Byeon
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Yongho Ha
 

What's hot (20)

코로나19로 인해 변화된 우리 시대의 데이터 트랜드
코로나19로 인해 변화된 우리 시대의 데이터 트랜드코로나19로 인해 변화된 우리 시대의 데이터 트랜드
코로나19로 인해 변화된 우리 시대의 데이터 트랜드
 
ClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei MilovidovClickHouse Deep Dive, by Aleksei Milovidov
ClickHouse Deep Dive, by Aleksei Milovidov
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
Improving SparkSQL Performance by 30%: How We Optimize Parquet Pushdown and P...
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
 
PostgreSQL, performance for queries with grouping
PostgreSQL, performance for queries with groupingPostgreSQL, performance for queries with grouping
PostgreSQL, performance for queries with grouping
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
Trino: A Ludicrously Fast Query Engine - Pulsar Summit NA 2021
 
인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템인공지능추천시스템 airs개발기_모델링과시스템
인공지능추천시스템 airs개발기_모델링과시스템
 
Sw occlusion culling
Sw occlusion cullingSw occlusion culling
Sw occlusion culling
 
화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자화성에서 온 개발자, 금성에서 온 기획자
화성에서 온 개발자, 금성에서 온 기획자
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
머신러닝 해외 취업 준비: 닳고 닳은 이력서와 고통스러웠던 면접을 돌아보며 SNU 2018
 
High-speed Database Throughput Using Apache Arrow Flight SQL
High-speed Database Throughput Using Apache Arrow Flight SQLHigh-speed Database Throughput Using Apache Arrow Flight SQL
High-speed Database Throughput Using Apache Arrow Flight SQL
 
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
[MLOps KR 행사] MLOps 춘추 전국 시대 정리(210605)
 
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
 

Viewers also liked

No More "sbt assembly": Rethinking Spark-Submit using CueSheet
No More "sbt assembly": Rethinking Spark-Submit using CueSheetNo More "sbt assembly": Rethinking Spark-Submit using CueSheet
No More "sbt assembly": Rethinking Spark-Submit using CueSheet
Jong Wook Kim
 
dart:async로 맛보는 Functional Reactive Programming
dart:async로 맛보는 Functional Reactive Programmingdart:async로 맛보는 Functional Reactive Programming
dart:async로 맛보는 Functional Reactive ProgrammingJong Wook Kim
 
자바 전문가를 위한 스칼라 프로그래밍 언어
자바 전문가를 위한 스칼라 프로그래밍 언어자바 전문가를 위한 스칼라 프로그래밍 언어
자바 전문가를 위한 스칼라 프로그래밍 언어
Jong Wook Kim
 
Crash Course on Graphical models
Crash Course on Graphical modelsCrash Course on Graphical models
Crash Course on Graphical models
Jong Wook Kim
 
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹 : WoW 랭킹 서비스 wowz.kr를 사례로
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹: WoW 랭킹 서비스 wowz.kr를 사례로디스크 기반 Skip list를 사용한 대용량 실시간 랭킹: WoW 랭킹 서비스 wowz.kr를 사례로
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹 : WoW 랭킹 서비스 wowz.kr를 사례로
Seok-ju Yun
 
Cascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the StreamsCascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the Streams
mattpodwysocki
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
Jong Wook Kim
 
RxJS and Reactive Programming - Modern Web UI - May 2015
RxJS and Reactive Programming - Modern Web UI - May 2015RxJS and Reactive Programming - Modern Web UI - May 2015
RxJS and Reactive Programming - Modern Web UI - May 2015
Ben Lesh
 
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기 [NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
Jungsoo Lee
 
KAIST 후배들을 위한 유학에 관한 이야기
KAIST 후배들을 위한 유학에 관한 이야기KAIST 후배들을 위한 유학에 관한 이야기
KAIST 후배들을 위한 유학에 관한 이야기
Sang-il Oum
 
skip list
skip listskip list
skip list
iammutex
 
Skip gram shirakawa_20141121
Skip gram shirakawa_20141121Skip gram shirakawa_20141121
Skip gram shirakawa_20141121
Mathematical Systems Inc.
 
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of FacebookTech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
The Hive
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
Functional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwiftFunctional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwift
선협 이
 
혁신적인 웹컴포넌트 라이브러리 - Polymer
혁신적인 웹컴포넌트 라이브러리 - Polymer혁신적인 웹컴포넌트 라이브러리 - Polymer
혁신적인 웹컴포넌트 라이브러리 - Polymer
Jae Sung Park
 
Functional Reactive Programming with RxJS
Functional Reactive Programming with RxJSFunctional Reactive Programming with RxJS
Functional Reactive Programming with RxJS
stefanmayer13
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
NAVER / MusicPlatform
 
Principles of microservices velocity
Principles of microservices   velocityPrinciples of microservices   velocity
Principles of microservices velocity
Sam Newman
 

Viewers also liked (19)

No More "sbt assembly": Rethinking Spark-Submit using CueSheet
No More "sbt assembly": Rethinking Spark-Submit using CueSheetNo More "sbt assembly": Rethinking Spark-Submit using CueSheet
No More "sbt assembly": Rethinking Spark-Submit using CueSheet
 
dart:async로 맛보는 Functional Reactive Programming
dart:async로 맛보는 Functional Reactive Programmingdart:async로 맛보는 Functional Reactive Programming
dart:async로 맛보는 Functional Reactive Programming
 
자바 전문가를 위한 스칼라 프로그래밍 언어
자바 전문가를 위한 스칼라 프로그래밍 언어자바 전문가를 위한 스칼라 프로그래밍 언어
자바 전문가를 위한 스칼라 프로그래밍 언어
 
Crash Course on Graphical models
Crash Course on Graphical modelsCrash Course on Graphical models
Crash Course on Graphical models
 
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹 : WoW 랭킹 서비스 wowz.kr를 사례로
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹: WoW 랭킹 서비스 wowz.kr를 사례로디스크 기반 Skip list를 사용한 대용량 실시간 랭킹: WoW 랭킹 서비스 wowz.kr를 사례로
디스크 기반 Skip list를 사용한 대용량 실시간 랭킹 : WoW 랭킹 서비스 wowz.kr를 사례로
 
Cascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the StreamsCascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the Streams
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
RxJS and Reactive Programming - Modern Web UI - May 2015
RxJS and Reactive Programming - Modern Web UI - May 2015RxJS and Reactive Programming - Modern Web UI - May 2015
RxJS and Reactive Programming - Modern Web UI - May 2015
 
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기 [NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
[NDC 16] 당신은 사랑 받기 위해 태어난 사람: 3년차 게임 디자이너의 자존감 찾기
 
KAIST 후배들을 위한 유학에 관한 이야기
KAIST 후배들을 위한 유학에 관한 이야기KAIST 후배들을 위한 유학에 관한 이야기
KAIST 후배들을 위한 유학에 관한 이야기
 
skip list
skip listskip list
skip list
 
Skip gram shirakawa_20141121
Skip gram shirakawa_20141121Skip gram shirakawa_20141121
Skip gram shirakawa_20141121
 
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of FacebookTech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
Tech Talk: RocksDB Slides by Dhruba Borthakur & Haobo Xu of Facebook
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
Functional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwiftFunctional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwift
 
혁신적인 웹컴포넌트 라이브러리 - Polymer
혁신적인 웹컴포넌트 라이브러리 - Polymer혁신적인 웹컴포넌트 라이브러리 - Polymer
혁신적인 웹컴포넌트 라이브러리 - Polymer
 
Functional Reactive Programming with RxJS
Functional Reactive Programming with RxJSFunctional Reactive Programming with RxJS
Functional Reactive Programming with RxJS
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
 
Principles of microservices velocity
Principles of microservices   velocityPrinciples of microservices   velocity
Principles of microservices velocity
 

Skip List

  • 2. 스킵리스트란 Log시간에 검색/추가/제거를 수행할 수 있는 정렬된 자료구조 이진검색트리를 대체할 수 있음 스킵 포인터를 사용해서 빠르게 탐색 가능 - 9호선 급행처럼 구현이 간단함! 레퍼런스 없이 Red-Black Tree를 1시간 안에 구현할 수 있나요?
  • 3. 스킵리스트는 젊다! 1960 1980 1970 1990 Treap [Aragon & Seidel] R Tree [Guttman] AVL Tree [Avdelson- Velskii & Landis] RB Tree B Tree [Bayer] Splay Tree [Sleator & Tarjan] Skip List
  • 4. 아이디어 : 뛰어넘기 빠른 검색을 위해 한 칸씩 뛰어넘으면서 찾으면 어떨까? 메모리 : ½ N 만큼 더 사용 검색 : 최대 N/2 + 1 노드를 검사
  • 5. 아이디어 : 또 뛰어넘기 뛰어넘기 아이디어를 또 적용하면? 메모리 : ¾ N만큼 더 사용 속도 : 최대 N/4 + 3 노드를 검사
  • 6. 아이디어 : 계속 뛰어넘기 2i번째 노드는2i 개의 포인터를 가지도록 만들면? 메모리 : N 만큼 더 사용 속도 : O(log N) 개의 노드만을 검사 여기까진 이진검색트리랑 다를 게 없음
  • 7. 동적 데이터구조로서의 문제점 노드를 추가하거나 삭제하면 패턴이 무너지게 됨 다시 패턴을 만드는 데에는 O(N)이란 긴 시간이 필요함
  • 8. 스킵리스트: 확률적 자료구조 크기의 확률분포를 유지하기! 노드 중 ½은 포인터 1개를 가짐 노드 중 ¼은 포인터 2개를 가짐 노드 중 1/2i은 포인터 i개를 가짐 규칙적인 패턴을 유지할 필요가 없어짐 하지만 여전히 높은 확률로 Log N시간에 동작함 struct Node<T> { T key; Node<T> *forward[];};
  • 9. 스킵리스트 노드 크기의 분포는 앞서 보았던 리스트와 동일 다만 패턴이 다르게 나타남
  • 10. 매개변수 p i개의 포인터를 가진 노드가r 개라면pr개의 노드는i+1개의 포인터를 가짐 앞의 예제에서는 p = ½ p = ½일 때 가장 속도가 빠르다! 적당한 속도와 메모리 효율을 위해 p = ¼ 를 권장 포인터의 최대 개수는 log1𝑝𝑁개가 적당 대부분의 구현에서는 최대 개수를 20개 정도로 고정함  
  • 12. 노드 삽입하기 노드의 크기를 확률적으로 정함! 크기가 1이 될 확률은 (1-p) 크기가 2가 될 확률은 p(1-p) 크기가 3이 될 확률은 p2(1-p) … p에 따른 노드 크기의 분포
  • 13. 노드 삽입하기 앞쪽 포인터를 갱신하게 위해 BackLook배열을 유지하면서 탐색
  • 14. 노드 제거하기 같은 방식으로 BackLook배열을 유지하면서 탐색 제거하면서 앞뒤의 포인터를 이어줌 어차피 랜덤이므로 노드 크기의 분포 유지엔 영향이 없음
  • 15. 최악의 경우 O(N) 이 되지만 모든 노드의 크기가 같아지면 보통 리스트와 동일하게 됨. 하지만 길이 100짜리 리스트가 그렇게 될 확률은? 동전을 100번 던졌을 때 전부 앞면만 나올 확률 로또 1등먹을 확률! 검색시간이 기대값(Log N)의 3배 이상 걸릴 확률은 엄청나게 낮다!
  • 16. 메모리 사용량 비교 리스트 : 노드마다1개의 포인터 필요 이진검색트리: 노드마다2개의 포인터 필요 스킵리스트: 노드마다11−𝑝개의 포인터 필요 𝐸𝑋=𝑛=1∞𝑛𝑃(𝑋=𝑛)=𝑛=1∞𝑛𝑝𝑛−1(1−𝑝)=11−𝑝  
  • 17. 메모리 사용량 비교 p의 값에 따라 메모리 사용량을 타협할 수 있음 더 적은 메모리 만으로도 Log 시간에 검색 가능 노드당포인터 사용 이진트리 리스트 p
  • 18. 멀티스레드에서RB트리의 문제점 리밸런싱은 예측할 수 없지만 무겁다 – 재수없으면 망함 Thread Stall 락 락 락 락(리밸런싱) 락 락 락
  • 19. 스킵리스트는 병렬프로그래밍에 유리함 락이 길어질 확률은 매우 빠르게 작아지기 때문에 불규칙한 락 때문에 모든 스레드가 멈춰버릴 확률이 적다. 락을 포인터/노드별로로컬하게 걸 수 있어서 충돌의 위험이 더욱 작다. 하지만 Persistent하게 만들기는 트리보다 어렵다.
  • 20. 언제 스킵리스트를 쓸까? 멀티스레드에서 자주 수정할 컨테이너가 필요할 때 순차적으로 탐색할 필요가 많은 경우 예 : 타임라인상의 이벤트 관리 정렬할 필요가 없을 땐 해쉬테이블을 쓰는 것이 좋음 cache miss/fragmentation 등으로 인해 B-Tree보다 느리게 동작하는 경우도 있으므로 신중한 결정이 필요함
  • 21. 스킵리스트의 변형들 Indexed Skip List 엣지마다 길이를 저장해서 인덱스 접근이 가능 Deterministic Skip List 최악의 경우에도Log시간이지만 패턴 유지를 위한 비용이 필요함 1-2 skip list 바로 아래 레벨의 노드2개 이상을 지나가지 않도록 유지 2-3 tree 에 대응 1-2-3 skip list
  • 22. 스킵리스트 구현들 Redis (BSD) 스킵리스트를 이용한 key-value 저장 서버 (ANSI C) JAVA 1.6의 ConcurrentSkipListMap, Set 스킵리스트를 이용해 구현한 멀티스레드를 지원하는 map과 set Skipdb (BSD) B-Tree대신 스킵리스트를 사용해서 구현한 버클리DB 방식의 DB Qt의 Qmap (GPL, LGPL) Qt Framework중 GUI와 관계없는 기능을 모은 QtCore모듈에 있음 STL map과 유사한 방식으로 사용 가능
  • 23. Reference Pugh, William (June 1990). "Skip lists: a probabilistic alternative to balanced trees". Pugh, William (July 1989). “A Skip List Cookbook” Herlihy et. al. “A Probably Correct Concurrent Skip List” Fraser and Harris (2004). “Concurrent Programming Without Locks” Wikipedia : Skip List