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

2020년 11월 회고

2020년 11월 회고

블로그 시작한지 2달째 작성해보는 회고 (첫 작성한 블로그 후기 보러가기 ) 블로그 작성을 9월을 시작으로 벌써 2달이라는 시간이 지났다. 두달동안 나름 블로그를 열심히 작성해보겠다고 게시글들을 꽤 많이 작성했는데 지금 회고를 작성하면서 돌이켜 생각해보니 잘못 하고있었구나 생각이 든다. 분명 블로그 작성을 처음 마음먹었을때는 좋은 글솜씨로 작성은 못해도 남들에게 도움이 되는(?) 그런 양질의 블로그를 작성하고자 했고, 글솜씨를 늘려가는 것을 목표로 했었기 때문에 한달에 3편의 블로그 작성을 목표로 시작했었다. 그런데 다른 많은 분들의 블로그 게시글 수가 부럽기도 하고 나도 빨리 방문자 수를 늘려야지하는 마음에 양질의 글이 아닌 게시글 수 채우기에 급급해 의미없는 블로그들을 작성하고 있는 나를 발견했다....

Read More
2020년을 보내며

2020년을 보내며

2019년도에 했던 2020년 다짐으로 3학년 복학을 하면서 웹 개발 전반적으로 공부도하면서 학점관리와 토익, 토이 프로젝트를 진행하고자 했었다. 진행한 프로젝트 my-tech : 군휴학과 일반휴학포함 3년 휴학후에 다시 시작하는 컴퓨터과학 공부로써 기초부터 다시 공부하고 기록하기 위한 repository이고, 기본적인 markdown문법을 익히기 위해 md파일로 작성하였으며, git공부를 위해 블로그가 아닌 repo를 이용하여 기록한 글이다....

Read More
Set

Set

  • Java
  • 2021년 6월 1일

Set은 자바의 Collection중에 객체를 중복하지 않고 하나만 저장하는 자료구조로 List와 다르게 저장순서(index)를 따로 저장하지 않기 때문에 이를 통해 접근할 수 없다. Set interface 제공 메서드 메서드 리턴 값 설명 add(E e) boolean 객체 추가성공하면 true addAll(Collection c) boolean 컬렉션을 추가하면 데이터들을 Set에 맞게 저장 remove(Object o) boolean 객체 삭제 contains(Object o) boolean 객체가 포함되었는지 여부 eqauls(Object o) boolean 같은지 비교 clear() void Set 초기화 iterator() Iterator set 요소 접근하기 위한 Iterator객체 반환...

Read More