[자료구조] Heap힙

2024. 5. 16. 16:04·공부/자료구조
728x90

Selection / Insertions Sort의 문제점

  • 1단계 : 입력 set에서 큐 구축
  • 2단계 : 우선순위 큐 구축

  • Selection sort: Phase 1은 빠르지만 Phase 2는 매우 느리다.
  • Insertion sort: Phase 1은 매우 느리지만 Phase 2는 빠르다.

How can we balance the running times of the two phases?:

  • 효율적인 우선순위 큐의 구현은 heap이라는 데이터 구조를 사용

Heap Data Structures

Heap(힙): 이진 트리 T는 관계적 속성과 구조적 속성을 만

  1. 힙 순서 속성(Heap-order Property): 힙 T에서 루트가 아닌 모든 노드 v에 대해, v에 저장된 키는 v의 부모에 저장된 키보다 크거나 같다.
  2. 완전 이진 트리 속성(Complete binary tree property): 높이 h를 가진 힙 T에서
    • T의 레벨 0부터 h-1까지의 각 레벨은 가능한 최대 노드 수를 갖습니다. (레벨 i는 2^i개의 노드를 가집니다, 0 ≤ i ≤ h-1)
    • 레벨 h에서, 모든 내부 노드는 외부 노드의 왼쪽에 있으며, 최대 하나의 자식을 가진 노드가 있다. 이 자식은 왼쪽 자식이어야 함.
  • 힙의 마지막 노드는 최대 깊이의 가장 오른쪽 노드

Height of a Heap

정리: 키 n개를 저장하는 힙은 높이 O(log n)

증명: 완전 이진 트리 속성complete binary tree

  • 키 n개를 저장하는 힙의 높이를 h라고 둔다.
  • i = 0부터 h - 1까지의 각 깊이에는 2^i개의 키가 있고, h 깊이에는 적어도 하나의 키가 존
  • 따라서, n ≥ 1 + 2 + 4 + ... + 2^(h-1) + 1
  • 따라서, n ≥ 2^h, 즉 h ≤ log n

힙과 우선순위 큐

  • 힙을 사용하여 우선순위 큐 구현
  • 각 내부 노드에는 (key, element)저장
  • 마지막 노드의 위치를 추적(루트 노드 포함)

Insertion into a Heap 힙 삽입

  1. 삽입 노드 z를 찾는다. (새로운 마지막 노드)
  2. z에 k를 저장
  3. 힙 순서 속성 heap - order property 복원

Upheap

  • 새로운 키 k가 insert 된 이후에는 heap order에 위배될 수 있다.
  • upheap 알고리즘은 삽입 노드로부터 위쪽 경로를 따라 k를 교환
  • k가 루트에 도달하거나, parent의 키가 k보다 작거나 같은 노드에 도달할 때까지 실행
  • 힙의 높이 = O(log n) ⇒ upheap 실행 시간 : O(log n)

Removal from a Heap 힙에서 제거

  1. 루트의 키를 마지막 노드 w로 대체
  2. w를 제거
  3. 힙 order 복원

Downheap

  • 루트 키를 k로 대체하면 힙 order이 깨질 수 있다.
  • downheap 알고리즘은 아래쪽 경로를 따라 키 k를 교환
  • k가 리프 노드에 도달하거나, child의 키가 k보다 크거나 같은 노드에 도달할 때까지 실행
  • 힙의 높이 = O(log n) ⇒ upheap 실행 시간 : O(log n)

Updating the Last Node

  • 삽입 노드는 O(log n)노드의 경로를 탐색하여 찾을 수 있다.

  1. Last node가 left-child인 경우 : Sibling이 insertion 위치
  2. Last node가 Right-child인 경우 :
    1. left-child 노드를 만날 때 까지 이동 → Right-child(Sibling)으로 이동→리프노드를 만날 때까지 Left로 이동
    2. 루트를 만날 때까지 이동→ 리프 노드를 만날 때까지 Left로 이동 → Leaf노드가 insertion 위치

Bottom-up Heap Construction

O(n)

Heap-Sort

  • 공간 : O(n)
  • insert , removeMin : O(logn)
  • size, isEmpty, min : O(1)
  • 힙 정렬 : O(nlogn)
  • 삽입 정렬이나 선택 정렬보다 빠르다

In-Place Heap Sort

  • 시퀀스는 배열을 통해 구현된다고 가정
  • 힙 정렬을 가속화, 공간 요구 사항을 상수 배로 줄임
  • 시퀀스의 원소를 재배열

  • 힙의 원소는 S의 왼쪽 부분(i-1)에 저장
  • 정렬되지 않은 원소는 오른쪽 부분(i부터 n까지)에 저장
  • S의 첫 i개의 원소는 힙의 벡터 표현을 제공한다.
  • empty heap에서 시작해서 경계를 한칸씩 오른쪽으로 이동
  • i단계에서는 i의 원소를 추가하여 힙을 확장

Phase 1 : Heap 만들기

  • 빈 heap에서 시작하여 힙과 시퀀스의 경계를 오른쪽으로 이동한다.

Phase 2 : Heap 정렬

  • 빈 시퀀스에서 시작하여 힙과 시퀀스의 경계를 왼쪽으로 이동한다.

Merging Two Heaps

  • 두 개의 Heap과 키 k가 주어진다.
  • 루트 노드로 k를 갖고 두 개의 Heap을 sub Tree로 갖는 새 Heap을 생성
  • heap - order 특성을 복원하기 위해 downHeap을 사용
    •  
728x90

'공부 > 자료구조' 카테고리의 다른 글

[자료구조] Red-Black Tree 레드-블랙 트리  (0) 2024.05.29
[자료구조] (2,4) Trees 2-3-4트리  (0) 2024.05.20
[자료구조] AVL 트리  (0) 2024.05.20
[자료구조] Binary Search Tree 이진 탐색 트리  (0) 2024.05.20
[자료구조] Priority Queues 우선순위 큐  (0) 2024.05.16
'공부/자료구조' 카테고리의 다른 글
  • [자료구조] (2,4) Trees 2-3-4트리
  • [자료구조] AVL 트리
  • [자료구조] Binary Search Tree 이진 탐색 트리
  • [자료구조] Priority Queues 우선순위 큐
knhoo
knhoo
  • knhoo
    &*
    knhoo
  • 전체
    오늘
    어제
    • 전체 (139)
      • Unity 개발일지 (1)
        • [Unity2D]졸업프로젝트 (17)
        • [Unity3D]VR프로젝트 (2)
      • 공부 (115)
        • 부트캠프 (12)
        • C++ (39)
        • Unity & C# (8)
        • 데이터베이스 (2)
        • 컴퓨터비전 (0)
        • 컴퓨터구조 (0)
        • python (7)
        • BAEKJOON (36)
        • 개발 (2)
        • 자료구조 (9)
      • 일상 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 📖README
  • 인기 글

  • 태그

    Python
    앱테크
    머니워크
    C++
    unity
    Cpp
    자료구조
    백준 #python
    멋쟁이사자처럼후기
    c#
    unity2d
    티스토리챌린지
    패널파워
    캐시워크
    비트버니
    백준
    til
    오블완
    야핏무브
    구간합
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
knhoo
[자료구조] Heap힙
상단으로

티스토리툴바