알고리즘 스터디 발표 차례라.. 겸사겸사.. 발표용 자료 만들기...
+내가 나중에 찾아보기 편하도록 정리하는 힙 정렬 알고리즘 포스팅
시간복잡도 비교
- 배열의 최대값, 최소값 찾기 = O(n)
- Heap에서 찾기 = O(logn)
1) 제일 아래 왼쪽 노드부터 채워짐
2) 채워진 노드가 그 위치의 부모 노드보다 크면 부모 노드와 자리 바꿈
1) 보통 root 노드부터 삭제
- 최대값, 최소값을 사용하기 위해 사용하는 자료구조다 보니)
2) root 노드 삭제 후, 가장 마지막에 추가한 노드를 root 노드 자리로 옮김
3) 새로운 root 노드가 아래의 자식 노드들보다 작으면, 자식 노드 중 큰 값의 노드와 자리를 바꿔줌
파이썬에서는 'heapq' 라는 내장함수를 사용한다.
힙 리스트 생성, 원소 추가
힙은 기본적으로 빈 리스트에서 시작해 힙 모듈로 원소를 추가(heappush)하거나,
기존의 리스트를 힙 구조로 만들어 주고(heapify) 시작한다.
1) 빈 리스트 생성 + 원소 추가
# 빈 리스트 생성
heap_list = []
# 원소 추가 : heapq.heappush(리스트명, 원소)
heapq.heappush(heap_list, 3)
heapq.heappush(heap_list, 7)
heapq.heappush(heap_list, 1)
heapq.heappush(heap_list, 5)
heapq.heappush(heap_list, 9)
# 확인
print(heap_list)
> [1, 5, 3, 7, 9]
2) 기존 리스트 힙 구조로 변경
# 기존 리스트
heap_list = [3,7,1,5,9]
# 힙 구조화
heapq.heapify(heap_list)
# 확인
print(heap_list)
> [1, 5, 3, 7, 9]
원소 삭제
1) root 노드 위치의 원소 리턴 후 삭제.
# 최소힙 리스트
heap_list = [3,7,1,5,9]
heapq.heapify(heap_list)
# 원소 삭제 후 다시 힙 구조화
heapq.heappop(heap_list) # 리턴 후 삭제, list의 pop처럼.
# 확인
print(heap_list)
> [3, 5, 9, 7]