페어링 힙
Pairing heap품질 향상을 위해 이 글에 컴퓨터 도표나 도표를 포함시킬 것을 요청한다.구체적인 일러스트, 플롯 또는 도표는 그래픽 랩에서 요청할 수 있다. 자세한 내용은 이 페이지의 토론 및/또는 위키백과의 목록을 참조하십시오.요청한 이미지. |
페어링 힙 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
유형 | 산더미처럼 쌓다 | ||||||||||||||||||||||||
발명된 | 1986 | ||||||||||||||||||||||||
발명된 사람 | 마이클 L.프레드먼, 로버트 세지윅, 다니엘 슬레이터, 로버트 엔드레 타르잔 | ||||||||||||||||||||||||
큰 O 표기법에서의 시간 복잡성 | |||||||||||||||||||||||||
|
페어링 힙(pairing hip)은 비교적 구현이 간단하고 실제 상각 성능이 우수한 힙 데이터 구조의 일종으로, 1986년 마이클 프레드먼, 로버트 세지윅, 다니엘 슬레이터, 로버트 타르잔이 도입했다.[1]페어링 힙은 힙으로 정렬된 다방향 트리 구조로 단순화된 피보나치 힙으로 간주할 수 있다.Prim의 MST 알고리즘과 같은 알고리즘을 구현하기 위한 "확실한 선택"으로 간주되며,[2] 다음과 같은 작업을 지원한다(min-heap을 가정).
- find-min: 힙의 상단 요소를 반환하십시오.
- meld: 두 뿌리 원소를 비교한다. 작은 뿌리 원소는 결과의 근원으로 남아 있고, 큰 원소는 이 근원의 자식으로 추가된다.
- 삽입: 삽입된 요소에 대한 새 힙을 만들고 원래 힙에 결합하십시오.
- delay-key(옵션): 줄일 키에 뿌리를 둔 하위 트리를 제거하고 키를 더 작은 키로 교체한 다음 결과를 다시 힙에 결합한다.
- delete-min: 한 트리가 남을 때까지 루트를 제거하고 하위 트리의 반복적인 결합을 수행한다.다양한 합병 전략을 채택하고 있다.
페어링 힙의 시간 복잡성에 대한 분석은 처음에 splay 트리의 그것에서 영감을 얻었다.[1]삭제분 당 상각된 시간은 O(log n)이고, O(1) 상각시간 내에 작업 find-min, meld, insert run을 수행한다.[3]
감소키 동작도 추가되면 페어링 힙의 정확한 무증상 작동 시간을 결정하는 것은 어려운 것으로 드러났다.초기에는 이 연산의 시간 복잡성이 O(1)라고 경험적 근거로 추측되었지만, Fredman은 일부 연산의 순서에 대해 감소키당 상각된 시간이 적어도 log ) \log 임을 증명했다.[4][5].[6]Elmasry 후 w.에 대합 더미( 게으르에서 통일되)의 elaborations을 소개했다 다른 상각 논의를 사용하여 Pettie고 decrease-key는 OOO(로그 n){\displaystyle o(n\log)}은 O(22로그 로그 n){O(2^{2{\sqrt{\log \log n}}})\displaystyle}분할 상환 시간에서 그, 혼합을 거두었다안녕ch 감소키 실행은 O ) 상각 시간 및 기타 작업에는 최적의 상각 한계가 있지만, [7][8] ) n 바인딩된 tight은 원래 데이터 구조에 대해 알려져 있지 않다.[3][6]
페어링 힙의 무증상 성능은 ( ) 상각 시간에서 감소키를 수행하는 피보나치 힙스와 같은 다른 우선순위 대기열 알고리즘보다 낮지만, 실제 성능은 우수하다.존스와[9] 라킨, 센, 타르잔은[10] 힙과 다른 힙 데이터 구조에 대한 실험을 실시했다.그들은 감소키 작업이 필요하지 않을 때(따라서 감소키에서 노드의 위치를 외부적으로 추적할 필요가 없을 때), 바이너리 힙과 같은 d-ari 힙은 다른 모든 힙 구현보다 빠르지만 감소키가 필요할 때 종종 d-ari 힙보다 빠르고 거의 항상 oth보다 빠르다고 결론지었다.이론적으로 더 효율적인 피보나치 힙과 같은 데이터 구조를 포함하여 포인터 기반 힙Chen 외 [11]연구진은 Dijkstra의 알고리즘에 사용하기 위해 특히 우선순위 대기열을 조사했고 정상적인 경우(대신 힙의 노드를 복제하고 중복 인스턴스를 무시하는 대신) 감소 키 없이 d-ary 힙을 사용하면 이론적 성능 보장이 열악함에도 불구하고 성능이 향상된다는 결론을 내렸다.
구조
페어링 힙은 빈 힙이거나 루트 요소와 페어링 트리의 빈 목록으로 구성된 페어링 트리입니다.힙 순서 지정 속성은 모든 노드의 상위 노드가 노드 자체보다 크지 않아야 함을 요구한다.다음 설명은 감소키 연산을 지원하지 않는 순기능 힙을 가정한다.
Type PairingTree[Elem] = 힙(Elem: Elem, 하위 heaps: List[PairingTree[Elem]) 유형 PairingHeap[Elem] = 비어 있는 PairingTree[Elem] = Elem]
RAM 기계에 대한 포인터 기반 구현은 단일 연결 목록(노드의 첫 번째 자식, 다음 형제 및 이전 형제(또는 가장 왼쪽 형제)에 대한 포인터)으로 노드의 자식을 나타냄으로써 노드당 세 개의 포인터를 사용하여 달성할 수 있다.또는 "목록의 끝"을 나타내기 위해 단일 부울 플래그가 추가된 경우, 마지막 아이가 부모 쪽을 가리키도록 하여 이전 포인터를 생략할 수 있다.이것은 작업당 일정한 오버헤드 계수를 희생하여 보다 컴팩트한 구조를 달성한다.[1]
운영
소인을 찾아내다
find-min 함수는 단순히 힙의 루트 요소를 반환한다.
function find-min(heap: PairingHeap[Elem]) -> 힙이 비어 있는 경우 Elem, 그렇지 않으면 힙을 반환함.Elem
섞다
빈 힙을 사용하여 결합하면 다른 힙이 반환되고, 그렇지 않으면 두 루트 요소 중 최소값을 루트 요소로 가지고 있는 새 힙이 반환되며, 더 큰 루트를 가진 힙을 하위 힙 목록에 추가하기만 하면 된다.
function meld(heap1, heap2: PairingHeap[Elem]) -> PairingHeap[Elem] if heap1 is Empty return heap2 elsif heap2 is Empty return heap1 elsif heap1.elem < heap2.elem return Heap(heap1.elem, heap2 :: heap1.subheaps) else return Heap(heap2.elem, heap1 :: heap2.하위 힙)
삽입하다
힙에 요소를 삽입하는 가장 쉬운 방법은 이 요소만 포함하는 새 힙과 하위 힙의 빈 목록으로 힙을 결합하는 것이다.
함수 삽입(Elem: Elem, 힙: PairingHeap[Elem] -> PairingHeap[Elem] 반환 meld(Heap(Elem, []), 힙)
삭제민
유일한 비종교적 기본 작동은 힙에서 최소 요소를 삭제하는 것이다.이것은 오직 한 그루의 나무만이 남을 때까지 그것의 아이들의 반복적인 결합을 수행하도록 요구한다.표준 전략은 먼저 서브 heap을 왼쪽에서 오른쪽으로 짝을 지어 혼합한 다음(이 단계가 이 데이터 구조에 이름을 부여한 단계임) 결과 heaps 목록을 오른쪽에서 왼쪽으로 혼합한다.
함수 delete-min(heap: PairingHeap[Elem]) -> PairingHeap[Elem] 힙이 비어 있는 경우 merge-pares를 반환하지 않으면(heap.subheaps)
보조 함수 병합 쌍을 사용한다.
함수 병합 쌍[목록: PairingTree[Elem]] -> 쌍화합[Elem] 길이(목록) = 0이면 빈 엘시프 길이(목록) ==1개 반환 목록[0] 또는 반환 meld(목록[0], 목록[1], 병합 쌍화합[2..]
이렇게 하면 실제로 기술된 좌우 투패스, 좌우합병 전략을 구현할 수 있다는 사실은 이러한 감소에서 확인할 수 있다.
Merge-pairs([H1, H2, H3, H4, H5, H6, H7])=>, meld( 섞이다(H1, H2), merge-pairs([H3, H4, H5, H6, H7]))#H12에 H1과 H2meld, 다음 목록의 나머지 =>, meld(H12, 혼합하다(혼합하다(H3, H4), merge-pairs([H5, H6, H7])))#H34, 다음 목록 =>의 나머지에 H3과 H4혼합, meld(H12, 혼합하다(H34, 혼합하다(혼합하다(H5, H6), merge-pairs([H7]))))#. 섞이다 H목록 =>의 5와 H6 H56, 그 다음에 나머지, meld(H12, 혼합하다(H34, 혼합하다(H56, H7)))#스위치 방향, H567 => 있는 meld(H12, 혼합하다(H34, H567))#, H34567 => 있는 meld(H12, H34567)#마침내, 나머지 => 통합하는 결과와 첫번째 쌍을 잘 지난 2결과 다수 meld 있다; 지난 두 결과 다수 meld H.1234567
실행 시간 요약
여기 다양한 힙 데이터 구조의 시간 복잡성이[12] 있다.함수 이름은 최소 히프를 가정한다."O(f)"와 "θ(f)"의 의미는 빅 O 표기법을 참조하십시오.
작전 | 소인을 찾아내다 | 삭제민 | 삽입하다 | 줄임말 | 섞다 |
---|---|---|---|---|---|
이진수[12] | Θ(1) | θ(log n) | O(log n) | O(log n) | θ(n) |
좌익 | Θ(1) | θ(log n) | θ(log n) | O(log n) | θ(log n) |
이항체[12][13] | Θ(1) | θ(log n) | Θ(1)[a] | θ(log n) | O(log n)[b] |
피보나치[12][14] | Θ(1) | O(log n)[a] | Θ(1) | Θ(1)[a] | Θ(1) |
페어링[3] | Θ(1) | O(log n)[a] | Θ(1) | o(log n)[a][c] | Θ(1) |
브로달[17][d] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
랭크페어링[19] | Θ(1) | O(log n)[a] | Θ(1) | Θ(1)[a] | Θ(1) |
엄격한 피보나치[20] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
2-3 힙[21] | O(log n) | O(log n)[a] | O(log n)[a] | Θ(1) | ? |
참조
- ^ a b c Fredman, Michael L.; Sedgewick, Robert; Sleator, Daniel D.; Tarjan, Robert E. (1986). "The pairing heap: a new form of self-adjusting heap" (PDF). Algorithmica. 1 (1–4): 111–129. doi:10.1007/BF01840439. S2CID 23664143.
- ^ Mehlhorn, Kurt; Sanders, Peter (2008). Algorithms and Data Structures: The Basic Toolbox (PDF). Springer. p. 231.
- ^ a b c Iacono, John (2000), "Improved upper bounds for pairing heaps", Proc. 7th Scandinavian Workshop on Algorithm Theory (PDF), Lecture Notes in Computer Science, vol. 1851, Springer-Verlag, pp. 63–77, arXiv:1110.4428, CiteSeerX 10.1.1.748.7812, doi:10.1007/3-540-44985-X_5, ISBN 3-540-67690-2
- ^ Stasko, John T.; Vitter, Jeffrey S. (1987), "Pairing heaps: experiments and analysis" (PDF), Communications of the ACM, 30 (3): 234–249, CiteSeerX 10.1.1.106.2988, doi:10.1145/214748.214759, S2CID 17811811
- ^ Fredman, Michael L. (1999). "On the efficiency of pairing heaps and related data structures" (PDF). Journal of the ACM. 46 (4): 473–501. doi:10.1145/320211.320214. S2CID 16115266. Archived from the original (PDF) on 2011-07-21. Retrieved 2011-05-03.
- ^ a b Pettie, Seth (2005), "Towards a final analysis of pairing heaps" (PDF), Proc. 46th Annual IEEE Symposium on Foundations of Computer Science (PDF), pp. 174–183, doi:10.1109/SFCS.2005.75, ISBN 0-7695-2468-0, S2CID 2717102
- ^ Elmasry, Amr (2009), "Pairing heaps with O(log log n) decrease cost" (PDF), Proc. 20th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 471–476, CiteSeerX 10.1.1.502.6706, doi:10.1137/1.9781611973068.52
- ^ Elmasry, Amr (November 2017). "Toward Optimal Self-Adjusting Heaps". ACM Transactions on Algorithms. 13 (4): 1–14. doi:10.1145/3147138. S2CID 1182235.
- ^ Jones, Douglas W. (1986). "An empirical comparison of priority-queue and event-set implementations". Communications of the ACM. 29 (4): 300–311. CiteSeerX 10.1.1.117.9380. doi:10.1145/5684.5686. S2CID 43650389.
- ^ Larkin, Daniel H.; Sen, Siddhartha; Tarjan, Robert E. (2014), "A back-to-basics empirical study of priority queues", Proceedings of the 16th Workshop on Algorithm Engineering and Experiments, pp. 61–72, arXiv:1403.0252, doi:10.1137/1.9781611973198.7, S2CID 15216766
- ^ Chen, Mo; Chowdhury, Rezaul Alam; Ramachandran, Vijaya; Roche, David Lan; Tong, Lingling (12 October 2007). Priority Queues and Dijkstra's Algorithm (PDF) (Technical report). University of Texas. TR-07-54.
{{cite techreport}}
: CS1 maint: 날짜 및 연도(링크) - ^ a b c d Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990). Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill. ISBN 0-262-03141-8.
- ^ "Binomial Heap Brilliant Math & Science Wiki". brilliant.org. Retrieved 2019-09-30.
- ^ Fredman, Michael Lawrence; Tarjan, Robert E. (July 1987). "Fibonacci heaps and their uses in improved network optimization algorithms" (PDF). Journal of the Association for Computing Machinery. 34 (3): 596–615. CiteSeerX 10.1.1.309.8927. doi:10.1145/28869.28874.
- ^ Fredman, Michael Lawrence (July 1999). "On the Efficiency of Pairing Heaps and Related Data Structures" (PDF). Journal of the Association for Computing Machinery. 46 (4): 473–501. doi:10.1145/320211.320214.
- ^ Pettie, Seth (2005). Towards a Final Analysis of Pairing Heaps (PDF). FOCS '05 Proceedings of the 46th Annual IEEE Symposium on Foundations of Computer Science. pp. 174–183. CiteSeerX 10.1.1.549.471. doi:10.1109/SFCS.2005.75. ISBN 0-7695-2468-0.
- ^ Brodal, Gerth S. (1996), "Worst-Case Efficient Priority Queues" (PDF), Proc. 7th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 52–58
- ^ Goodrich, Michael T.; Tamassia, Roberto (2004). "7.3.6. Bottom-Up Heap Construction". Data Structures and Algorithms in Java (3rd ed.). pp. 338–341. ISBN 0-471-46983-1.
- ^ Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (November 2011). "Rank-pairing heaps" (PDF). SIAM J. Computing. 40 (6): 1463–1485. doi:10.1137/100785351.
- ^ Brodal, Gerth Stølting; Lagogiannis, George; Tarjan, Robert E. (2012). Strict Fibonacci heaps (PDF). Proceedings of the 44th symposium on Theory of Computing - STOC '12. pp. 1177–1184. CiteSeerX 10.1.1.233.1740. doi:10.1145/2213977.2214082. ISBN 978-1-4503-1245-5.
- ^ Takaoka, Tadao (1999), Theory of 2–3 Heaps (PDF), p. 12
외부 링크
- Louis Wasserman은 The Monad Reader, Issue 16 (pp. 37–52)의 Haskell에서 짝짓기 힙과 그 구현에 대해 논의한다.
- 페어링 히프, 사르타즈 사니