▶ 최솟값이나 최댓값을 빠르게 찾아내기 위해서 ( 완전 이진 트리를 기반)
최대힙 : 부모노드 값 > 자식 노드
최소힙 : 부모노드 값 < 자식노드
▶ O(N * log N)
: 한 번 자식 노드로 내려갈 때마다 노드의 갯수가 2배씩 증가한다는 점 (ex 데이터의 갯수가 1024개라면 대략 10번만 내려가도 됨)
▶ 효율적
: 별도로 추가적인 배열이 필요하지 않다는 점에서 몹수 효율적. 힙 정렬이 우위긴 하지만 단순히 속도면에서는 퀵정렬이 빠르기에 힙정렬이 많이 사용되지는 않음.
출처 : https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html
데이터가 첫 인덱스(루트) 노드부터 자식노드가 왼쪽, 오른쪽으로 차근차근 들어가는 구조. 즉 ,중간에 비어있는 곳 x
트리에서 최대 힙을 만족하고 싶지만 그렇지 않을 경우(위 사진처럼) 힙 정렬 수행 => 힙 생성 알고리즘을 사용
▶ import heapq
▶ heapq.heapify(리스트)
▶ 리스트와 별개의 자료구조가 아님.
▶ 따라서 heapq 모듈의 함수를 호출할 때 마다 이 리스트를 인자로 넘겨야함.
▶ 힙 생성할 거면 그냥 빈 리스트 생성하면 됨.
▶ 파이썬에서는 heapq 모듈을 통해서 원소를 추가하거나 삭제한 리스트가 그냥 최소 힙
▶heapq.heappush(리스트, 넣을 값)
▶ heapq.heappop(리스트)
▶ print(heap[0])
힙의 구조상 인덱스 1에 두번째로 작은 원소가 있다는 것은 아니다.
따라서 두번째로 작은 원소를 얻으려 heappop()을 통해 가장 작은 원소를 삭제 후, heap[0]를 통해 새로운 최소값에 접근. (heap[1] x)