페어링 힙

Pairing heap
페어링 힙
유형산더미처럼 쌓다
발명된1986
발명된 사람마이클 L.프레드먼, 로버트 세지윅, 다니엘 슬레이터, 로버트 엔드레 타르잔
O 표기법에서의 시간 복잡성
알고리즘. 평균 최악의 경우
삽입하다 Θ(1)
찾기민 Θ(1)
삭제민 O(log n)
감소키 O(log n)
병합 Θ(1)

페어링 힙(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, 다음 목록 =&gt의 나머지에 H3과 H4혼합, meld(H12, 혼합하다(H34, 혼합하다(혼합하다(H5, H6), merge-pairs([H7]))))#. 섞이다 H목록 =&gt의 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) ?
  1. ^ a b c d e f g h i 상각시간.
  2. ^ n은 더 큰 힙의 크기 입니다.
  3. ^ 의 하한log ), 의 상한[15] 2 n ). {\sqrt[16]
  4. ^ 브로달과 오카사키에서는 나중에 지원되지 않는 감소키를 제외하고 같은 경계를 가진 지속 변종을 기술한다.원소가 n개인 힙은 O(n)에 상향으로 시공할 수 있다.[18]

참조

  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.
  2. ^ Mehlhorn, Kurt; Sanders, Peter (2008). Algorithms and Data Structures: The Basic Toolbox (PDF). Springer. p. 231.
  3. ^ 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
  4. ^ 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
  5. ^ 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.
  6. ^ 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
  7. ^ 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
  8. ^ Elmasry, Amr (November 2017). "Toward Optimal Self-Adjusting Heaps". ACM Transactions on Algorithms. 13 (4): 1–14. doi:10.1145/3147138. S2CID 1182235.
  9. ^ 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.
  10. ^ 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
  11. ^ 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: 날짜 및 연도(링크)
  12. ^ 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.
  13. ^ "Binomial Heap Brilliant Math & Science Wiki". brilliant.org. Retrieved 2019-09-30.
  14. ^ 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.
  15. ^ 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.
  16. ^ 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.
  17. ^ Brodal, Gerth S. (1996), "Worst-Case Efficient Priority Queues" (PDF), Proc. 7th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 52–58
  18. ^ 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.
  19. ^ Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (November 2011). "Rank-pairing heaps" (PDF). SIAM J. Computing. 40 (6): 1463–1485. doi:10.1137/100785351.
  20. ^ 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.
  21. ^ Takaoka, Tadao (1999), Theory of 2–3 Heaps (PDF), p. 12

외부 링크