Heap

Tree중 하나로 최대,최솟값을 찾아내는 연산을 빠르게 하기 위한 완전 이진 트리이다. (Complete Binary Tree )

우선 순위를 무엇에 두냐에 따라 순서가 달라지기 때문에 자료가 들어온 시간을 우선순위로 놓는다고 하면 일반적인 큐도 우선순위 큐가 될 수 있다.


1. 최대 힙(Max Heap)

부모 노드의 key값이 자식 노드의 key값보다 크거나 같은 완전 이진 트리

c++을 이용한 코드 예



2. 최소 힙(Min Heap)

부모 노드의 key값이 자식 노드의 key값보다 작거나 같은 완전 이진 트리

c++을 이용한 코드 예



3. 구현

1) 루트 인덱스가 0일 경우

  • 왼쪽 자식의 인덱스 = 부모 인덱스 * 2 + 1
  • 오른쪽 자식의 인덱스 = 부모 인덱스 * 2 + 2
  • 부모 인덱스 = (자식의 인덱스 - 1) / 2

2) 루트 인덱스가 1일 경우

  • 왼쪽 자식의 인덱스 = 부모 인덱스 * 2
  • 오른쪽 자식의 인덱스 = 부모 인덱스 * 2 + 1
  • 부모 인덱스 = 자식의 인덱스 / 2

루트 인덱스를 0 | 1 중에 무엇으로 두냐에 따라 위와같이 구현방법이 조금 달라질 수 있다.


삽입

가장 끝에 삽입 후 부모 노드와 비교후 교체하면서 더이상 교체가 안될때까지 루트까지 올라가면 된다.

삭제

첫 번째 노드 값을 꺼낸 후 마지막 노드의 값을 첫 번째로 이동을 한 후,마지막 노드 삭제한다.

옮긴 첫번째 노드의 값을 아래로 내려가며(child와) 비교후 교체를 수행한다.



4. 시간 복잡도 ( Big-O )

자료구조시간 복잡도
최댓값 찾기 (Find Max)최댓값 추출 (Extract Max)키 증가 (Increase Key)삽입 (Insert)삭제 (Delete)합병 (Merge)
이진 힙 (Binary Heap)O(1)O(logn)O(logn)O(logn)O(logn)O(m+n)
페어링 힙 (Pairing Heap)O(1)O(logn)O(logn)O(1)O(logn)O(1)
이항 힙 (Binomial Heap)O(1)O(logn)O(logn)O(1)O(logn)O(logn)
피보나치 힙 (fibonacci Heap)O(1)O(logn)O(1)O(1)O(logn)O(1)



5. 사용 예

1) 허프만 코드

주어진 문자열을 이용하여 문자의 빈도수를 고려하여 2진수로 압축하는 알고리즘 중 하나로 최소 힙을 이용한다.


2) 우선순위 큐

우선순위의 개념을 큐에 도입한 자료 구조로 일반적인 큐는 FIFO의 규칙으로 먼저 들어온것이 나가게 되나 우선순위 큐는 우선순위가 높은 순서대로 나가게 된다.

Tags :

Related Posts

Tree

Tree

그래프의 일종으로, 여러 노드가 한개의 노드를 가리킬 수 없는 구조 선형구조가 아닌 (비선형), 부모자식의 관계를 가지는 계층형 구조 1. 용어 개념 (설명) Node (노드): 트리를 구성하고 있는 각각의 요소를 의미한다. Edge (= link, 간선) : 트리를 구성하기 위해 노드와 노드를 연결하는 선을 의미한다. Root Node (루트 노드) : 트리 구조에서 최상위에 있는 노드를 의...

Read More
PointRee 프로젝트 3 - back 개발환경 셋팅과 db설계

PointRee 프로젝트 3 - back 개발환경 셋팅과 db설계

IntelliJ를 이용해서 pointRee폴더 내에 back폴더를 생성해주고 여기에 spring boot 2.4로 프로젝트를 시작했다. dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' //db implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'com.h2database:h2' implementation 'mysql:mysql-connector-java' //lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' } dependency는 위와 같이 추가해주었다. 1. db설계 포인트의 유효기간을 처음에 생각을 했었으나 db설계와 구현과정에 있어 많은 시간이 생각보다 소요될...

Read More
Hugo와 Github page로 블로그 구축

Hugo와 Github page로 블로그 구축

Note 블로그를 작성하기로 마음 먹은 후에 가장 먼저 할 일이 블로그를 만드는 것이었다. hugo와 github을 사용하면서 블로그를 open하는 과정과 겪었던 문제점들, 추가한 내용들을 정리하여 hugo를 선택하신분들에게 조금이나마 도움이 되고자 한다. hugo를 선택한 이유 github page를 이용하여 블로그를 운영하는데 다양한 generat...

Read More