스킵 리스트
Skip list스킵 리스트 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
유형 | 목록. | ||||||||||||||||||||
발명된 | 1989 | ||||||||||||||||||||
발명자 | W. Puh | ||||||||||||||||||||
빅 O 표기의 시간 복잡도 | |||||||||||||||||||||
|
시리즈의 일부 |
확률론적 데이터 구조 |
---|
랜덤 트리 |
관련된 |
컴퓨터 과학에서 스킵 리스트는 On {n)\displaystyle {Olog n)\ n ndisplaystyle 요소 내에서 On)\displaystyle {O} 삽입 복잡성을 하는 확률론적 데이터 구조입니다.따라서 정적 배열에서는 불가능한 링크 목록과 같은 구조를 유지하면서 정렬된 배열(검색용)의 최상의 기능을 얻을 수 있습니다.고속 검색은 후속의 링크된 계층을 유지함으로써 가능하며, 후속의 각 계층은 이전 계층보다 적은 수의 요소를 건너뜁니다(아래 그림 참조).검색은 두 개의 연속된 요소(하나는 더 작고 다른 하나는 더 크거나)가 검색된 요소보다 작거나 큰 요소는 검색된 요소보다 큽니다.링크된 계층을 통해 이들 2개의 요소는 다음 극소수 서브시퀀스 요소에 링크되어 완전한 시퀀스로 검색할 때까지 검색이 계속됩니다.건너뛴 요소는 확률적으로[2] 또는 결정적으로 [3]선택될 수 있으며, 전자가 더 일반적입니다.
묘사

스킵 리스트는 레이어로 작성됩니다.맨 아래 계층은 일반적인 순서 연결 목록입니다.각 상위 레이어는 아래 목록의 "익스프레스 레인"으로 기능합니다.여기서 i(\i)의 요소는 일정한 p(\ p로 i i1)에 표시됩니다 p에 으로 사용되는2개의 값은/1/) 1입니다. 1/4 입니다.평균적으로 각 요소는 1/ ( -p) \ 1/ ( 1- p )에 표시되며, 가장 큰 요소(보통 건너뛰기 목록의 맨 앞에 있는 특수 헤드 요소)가 모든 목록에 표시됩니다.스킵 리스트에는 1 / \ _ { / (를 들어loggm 1 / \ 1/ 리스트가 됩니다.
대상 요소의 검색은 상위 목록의 선두 요소에서 시작하여 현재 요소가 대상 요소보다 크거나 같을 때까지 수평으로 진행됩니다.현재 요소가 대상과 동일한 경우 발견된 것입니다.현재 요소가 대상보다 크거나 검색이 링크된 목록의 끝에 도달한 경우 이전 요소로 돌아가 다음 하위 목록으로 수직으로 드롭다운한 후 이 절차를 반복합니다.각 링크 목록의 예상 스텝 수는 1/1/입니다.다음 상위 목록에 있는 요소에 도달하거나 현재 목록의 선두에 도달할 때까지 검색 경로를 타깃에서 역추적하여 확인할 수 있습니다.따라서p\p가 상수일 검색 예상 비용은 1 / n \ \1 \ _ { / } n 이며 이는 O ( n ) \ \{ \ n 입니다.pp의 을 다르게 선택함으로써 검색 비용을 스토리지 비용과 맞바꿀 수 있습니다.
구현 상세
건너뛰기 목록에 사용되는 요소는 여러 목록에 참여할 수 있으므로 두 개 이상의 포인터를 포함할 수 있습니다.
삽입 및 삭제는 "높은" 요소를 여러 링크 목록에 삽입하거나 둘 이상의 링크 목록에서 삭제해야 한다는 점을 제외하고는 대응하는 링크 목록 작업과 매우 유사합니다.
operations, which force us to visit every node in ascending order (such as printing the entire list), provide the opportunity to perform a behind-the-scenes derandomization of the level structure of the skip-list in an optimal way, bringing the skip list to 시간mathcal n(i번째 유한 노드의 수준을 1에 홀수가 되기 전에 i를 2로 반복적으로 나눌 수 있는 횟수를 더해서 선택합니다.또한 음의 무한 노드에 대해 가능한 가장 높은 레벨을 선택하는 일반적인 특수한 경우가 있으므로 음의 무한 헤더의 경우 i=0이다.)단, 이를 통해 레벨보다 상위1 노드의 위치를 모두 파악하고 삭제할 수도 있습니다.
또는 다음과 같은 방법으로 레벨 구조를 준랜덤으로 만들 수 있다.
모든 노드 솔직하다 1j← 1은 숫자의 집합점에서 수준 j1를 위해 하는 각 i'th 노드에서 수준 j는 것은 홀수 및 나는 아니다 마지막 노드에서 수준 j무작위로 선택하는지 여부에 그것에 수평 j+1 다른 만약은 심지어 노드 i-1이 아니었다 승진을 촉진하는 단계j+1 끝나면 반복 j ← j+1. 사원먹다
derandomized 버전과 마찬가지로 준랜덤화는O style(모든 노드를 방문함)\ 연산을 해야 하는 다른 이유가 있을 때만 수행됩니다.
이 준랜덤성의 장점은 비랜덤화만큼 적대적인 사용자에게 수준 구조 관련 정보를 거의 제공하지 않는다는 것입니다.이는 어떤 노드가 가장 낮은 수준이 아닌지 식별할 수 있는 적대적 사용자가 상위 수준의 노드를 삭제하는 것만으로 성능을 저하시킬 수 있기 때문에 바람직합니다.(베티아와 반복은 그럼에도 불구하고 적수가 확률론적 및 타이밍 방법을 사용하여 성능 저하를 강제할 수 있다고 주장한다.)[4]검색 성능은 여전히 로그 성능을 보장합니다.
다음과 같은 "최적화"를 하는 것이 바람직할 것입니다."다음은, 매 시간마다..."라고 적혀 있는 부분에서는 짝수 쌍마다 동전 던지기를 하는 것은 잊어버려라.동전을 한 번만 던지면 짝수만 홍보할지 홀수만 홍보할지 결정할 수 있습니다. logn {n)) 코인 플립 ( 코인 플립이 .불행히도, 이 경우 적대적인 사용자가 짝수 노드(레벨 1 이상의 노드 중)가 모두 레벨 1보다 높다고 추측할 때 정답의 확률이 50 대 50입니다.이는 특정 노드가 일부 정수N에 대해 레벨N이라고 추측할 가능성이 매우 낮다는 속성에도 불구하고 발생합니다.
스킵 리스트는 기존의 균형 트리 데이터 구조와 같은 절대적인 최악의 경우 성능을[5] 보장하지 않습니다. 스킵 리스트를 작성하는 데 사용되는 코인 플립은 항상(매우 낮은 확률로) 균형이 맞지 않는 구조를 생성할 수 있기 때문입니다.그러나, 그것들은 실제로 잘 작동하며, 무작위 균형 조정 방식은 균형 잡힌 이진 검색 트리에서 사용되는 결정론적 균형 조정 체계보다 구현하기가 더 쉽다고 주장되어 왔다.스킵 리스트는 데이터 구조를 글로벌하게 재조정하지 않고 스킵 리스트의 다른 부분에 병렬로 삽입할 수 있는 병렬 컴퓨팅에서도 유용합니다.이러한 병렬화는 임의의 단일 노드의 [6]손실에 대해 랜덤화된 스킵리스트를 견고하게 할 수 있기 때문에 애드혹 무선 네트워크에서의 자원 검출에 특히 유리합니다.
색인화 가능한 스키리스트
위에서 설명한 바와 같이 스킵 리스트는 정렬된 시퀀스에서 빠른 nn)\displaystyle\displaystyle\mathcal {O}(n)\discal {O}(n의 값 검색만 합니다. 단, 500번째 값은 반환됩니다.또한 랜덤 액세스인덱스된 룩업의 속도를 O로 변경할 수 없습니다.{ displaystyle { { ( n)。
모든 링크에 대해 링크 폭도 저장합니다.폭은 각 상위 레이어 "Express 레인" 링크가 통과하는 하위 레이어 링크의 수로 정의됩니다.
예를 들어 페이지 상단에 있는 예시의 링크 폭은 다음과 같습니다.
1.10시, ->,시요--------------------------------------------------->, o의 최고 1325시, ->,시------------->,시?->,시요--------------------->, o 레벨 3121232시, ->,시?-.>시, ->,시?->시------------->,시?->,o 레벨 211111111111시, ->,시, ->,시, ->,시, ->,시, ->,시, ->,시, ->,시, ->,시, ->,시, ->,시, ->, OOO하는 레벨 헤드 1일 2일 34일 5일 6일 7일 8일 9일 10일 AA는 노드 노드 노드 노드 노드 노드. 노드 노드 노드 노드
상위 레벨 링크의 폭은 그 아래에 있는 컴포넌트 링크의 합계입니다(즉, 폭 10 링크는 바로 아래에 있는 폭 3, 2, 5의 링크에 걸쳐 있습니다.따라서 모든 폭의 합계는 모든 수준에서 동일합니다(10 + 1 = 1 + 3 + 2 + 5 = 1 + 2 + 2 + 3 + 2 )
건너뛰기 목록을 색인화하고 i번째 값을 찾으려면 건너뛴 각 링크의 너비를 카운트다운하면서 건너뛰기 목록을 건너뜁니다.다가오는 폭이 너무 클 때마다 레벨을 내립니다.
예를 들어, 다섯 번째 위치(노드 5)에 있는 노드를 찾으려면 최상위 수준에서 너비 1의 링크를 통과합니다.이제 4단계가 더 필요하지만 이 레벨의 다음 폭은 10으로 너무 크므로 한 레벨을 떨어뜨립니다.너비 3의 링크 하나를 통과합니다.폭 2의 다른 단계는 너무 멀기 때문에 아래 레벨로 떨어트립니다.이제 폭 1의 마지막 링크를 통과하여 목표 실행 합계 5(1+3+1)에 도달합니다.
함수 lookupByPositionIndex(i) node ← head i ← i + 1 # i ≥노드 동안 위에서 아래로 수준을 나타내는 단계로 헤드를 계산하지 마십시오.다음 단계가 멀지 않은 경우 width[level] do # i ← i - node.width[level] # 현재 너비 노드 ← node.next[level] # 현재 레벨 반복 반환 노드.값 종료 함수로 앞으로 이동합니다.
이 인덱싱 구현 방법은 William[7] Pugh의 "건너뛰기 목록 요리책"에 자세히 설명되어 있습니다.
역사
스킵 리스트는 1989년 윌리엄 [8]퍼에 의해 처음 기술되었다.
작성자를 인용하려면:
스킵 리스트는 많은 애플리케이션을 위한 구현 방법으로서 균형 잡힌 트리를 대체할 가능성이 높은 확률론적 데이터 구조이다.건너뛰기 목록 알고리즘은 균형 트리와 점근 예상 시간 범위가 같으며 더 단순하고 빠르며 공간을 적게 사용합니다.
--
사용법
건너뛰기 목록을 사용하는 응용 프로그램 및 프레임워크 목록:
- Apache Portable Runtime은 건너뛰기 [9]목록을 구현합니다.
- MemSQL은 데이터베이스 기술을 위한 주요 색인 구조로 잠금 없는 건너뛰기 목록을 사용합니다.
- Cyrus IMAP 서버는 "스키리스트" 백엔드 DB 구현을[10] 제공합니다.
- Lucene은 건너뛰기 목록을 사용하여 델타 인코딩 게시 목록을 로그 [citation needed]시간으로 검색합니다.
- Qt의 "QMap" 키/값 사전(최대 Qt 4) 템플릿 클래스는 건너뛰기 [11]목록과 함께 구현됩니다.
- Redis는 Posix 시스템용 ANSI-C 오픈소스 영구 키/값 저장소이며 순서 집합 [12]구현에 건너뛰기 목록을 사용합니다.
- 매우 빠른 키 값 삽입형 데이터베이스 스토리지 엔진(LSM(log-Structured-Merge) 트리 사용)인 "nessDB"는 메모리 테이블에 [13]건너뛰기 목록을 사용합니다.
- "skipdb"는 ACID 순서 키/값 데이터베이스의 오픈 소스 구현으로, b-트리가 [14]아닌 건너뛰기 목록을 사용하여 구현됩니다.
- Java 1.6 [15]API의 ConcurrentSkipListSet 및 ConcurrentSkipListMap.Apache HBase에서 사용됩니다.
- 속도 테이블은 인덱스 및 잠금 없는 공유 메모리에 스키플리스트를 사용하는 Tcl의 빠른 키 값 데이터스토어입니다.
- "leveldb"는 Google에서 작성된 고속 키 값 스토리지 라이브러리로 문자열 키에서 문자열[16] 값으로 순서대로 매핑합니다.
- Con Kolivas의 Linux[17] 커널용 MuQSS 스케줄러에서 건너뛰기 목록 사용
- SkiMap은 로봇 매핑 시스템을 위한 보다 복잡한 3D 스파스 그리드를 구축하기 위해 스킵 리스트를 기본 데이터 구조로 사용합니다.[18]
- IOWOW는 스킵 리스트를 주요 데이터 구조로 사용하는 [19]영속적인 C11 키/값 스토리지 라이브러리입니다.
건너뛰기 목록은 실행 중인 중위수(이동 중위수라고도 [20]함)의 효율적인 통계 계산에 사용됩니다.
스킵 리스트는 분산 어플리케이션(노드는 물리 컴퓨터를 나타내고 포인터는 네트워크 접속을 나타냄) 및 잠금 [21]경합이 적은 확장성이 뛰어난 동시 priority 큐를 구현하거나 잠금 [22][23][24]없이 동시 [25]priority 큐를 구현하는 경우에도 사용됩니다.또한 (잠금 없는) priority 큐와 동시 [26]사전을 구현하기 위해 건너뛰기 목록을 사용하는 것에 대한 미국 특허도 몇 가지 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b Papadakis, Thomas (1993). Skip Lists and Probabilistic Analysis of Algorithms (PDF) (Ph.D.). University of Waterloo.
- ^ Pugh, W. (1990). "Skip lists: A probabilistic alternative to balanced trees" (PDF). Communications of the ACM. 33 (6): 668–676. doi:10.1145/78973.78977. S2CID 207691558.
- ^ Munro, J. Ian; Papadakis, Thomas; Sedgewick, Robert (1992). "Deterministic skip lists" (PDF). Proceedings of the third annual ACM-SIAM symposium on Discrete algorithms (SODA '92). Orlando, Florida, USA: Society for Industrial and Applied Mathematics, Philadelphia, PA, USA. pp. 367–375. S2CID 7477119.
- ^ Bethea, Darrell; Reiter, Michael K. (September 21–23, 2009). Data Structures with Unpredictable Timing (PDF). ESORICS 2009, 14th European Symposium on Research in Computer Security. Saint-Malo, France. pp. 456–471, §4 "Skip Lists". doi:10.1007/978-3-642-04444-1_28. ISBN 978-3-642-04443-4.
- ^ Sen, Sandeep (1991). "Some observations on skip lists". Information Processing Letters. 39 (4): 173–176. doi:10.1016/0020-0190(91)90175-H.
- ^ Shah, Gauri (2003). Distributed Data Structures for Peer-to-Peer Systems (PDF) (Ph.D. thesis). Yale University.
- ^ 윌리엄 푸"스킵리스트 요리책"1990. 섹션 3.4 선형 목록 작업.
- ^ Pugh, William (April 1989). Concurrent Maintenance of Skip Lists (PS, PDF) (Technical report). Dept. of Computer Science, U. Maryland. CS-TR-2222.
- ^ Apache Portable Runtime APR 1.6 매뉴얼
- ^ Cyrus IMAP 서버스키플리스트 소스 파일
- ^ QMap
- ^ "Redis ordered set implementation". GitHub.
- ^ 네스DB
- ^ 건너뛰다
- ^ ConcurrentSkipListSet 및 ConcurrentSkipListMap
- ^ 수평
- ^ "LKML: Con Kolivas: [ANNOUNCE] Multiple Queue Skiplist Scheduler version 0.120". lkml.org. Retrieved 2017-05-11.
- ^ Gregorio, Daniele De; Stefano, Luigi Di (2017). "SkiMap: An Efficient Mapping Framework for Robot Navigation". arXiv:1704.05832 [cs.CV].
- ^ 야우
- ^ 레이먼드 헤팅어입니다"지수화 가능한 스키플리스트(Python)를 사용하여 효율적으로 주행하는 중앙값"2009.
- ^ Shavit, N.; Lotan, I. (2000). "Skiplist-based concurrent priority queues" (PDF). Proceedings 14th International Parallel and Distributed Processing Symposium. IPDPS 2000. p. 263. CiteSeerX 10.1.1.116.3489. doi:10.1109/IPDPS.2000.845994. ISBN 978-0-7695-0574-9. S2CID 8664407.
- ^ Sundell, H.; Tsigas, P. (2003). "Fast and lock-free concurrent priority queues for multi-thread systems". Proceedings International Parallel and Distributed Processing Symposium. p. 11. CiteSeerX 10.1.1.113.4552. doi:10.1109/IPDPS.2003.1213189. ISBN 978-0-7695-1926-5. S2CID 20995116.
- ^ Fomitchev, Mikhail; Ruppert, Eric (2004). Lock-free linked lists and skip lists (PDF). Proc. Annual ACM Symp. on Principles of Distributed Computing (PODC). pp. 50–59. doi:10.1145/1011767.1011776. ISBN 1581138024.
- ^ Bajpai, R.; Dhara, K. K.; Krishnaswamy, V. (2008). "QPID: A Distributed Priority Queue with Item Locality". 2008 IEEE International Symposium on Parallel and Distributed Processing with Applications. p. 215. doi:10.1109/ISPA.2008.90. ISBN 978-0-7695-3471-8. S2CID 15677922.
- ^ Sundell, H. K.; Tsigas, P. (2004). "Scalable and lock-free concurrent dictionaries" (PDF). Proceedings of the 2004 ACM symposium on Applied computing - SAC '04. p. 1438. doi:10.1145/967900.968188. ISBN 978-1581138122. S2CID 10393486.
- ^ 미국 특허 7937378
외부 링크
- 알고리즘 및 데이터 구조 사전의 "건너뛰기 목록" 항목
- 스킵 리스트: C# 2.0의 MSDN 상의 셀프밸런싱 BST 라이크 속성을 가진 링크드리스트
- 목록을 건너뛰는 이유
- 목록 건너뛰기 강의(MIT OpenCourseWare: 알고리즘 소개)
- 개방형 데이터 구조 - 4장 - 스키리스트, Pat Morin
- 동시 접근 방식으로 목록을 건너뛸 수 있는 대체 데이터 구조인 트리 건너뛰기
- 스킵 트리의 분산 버전인 스킵 트리 그래프
- 스킵 트리의 분산 버전인 스킵 트리 그래프에 대한 자세한 정보