힙은,
우선순위 큐
를 위해 만들어진 자료구조다.
먼저우선순위 큐
에 대해서 간략히 알아보자
데이터들이 우선순위를 가지고 있음. 우선순위가 높은 데이터가 먼저 나감
시뮬레이션 시스템, 작업 스케줄링, 수치해석 계산
우선순위 큐는 배열, 연결리스트, 힙으로 구현 (힙으로 구현이 가장 효율적!)
우선순위 큐를 구현하는 표현 방법 | 삽입 | 삭제 |
---|---|---|
순서 없는 배열 | O(1) | O(n) |
순서 없는 연결리스트 | O(1) | O(n) |
정렬된 배열 | O(n) | O(1) |
정렬된 연결 리스트 | O(n) | O(1) |
힙 | O(logn) | O(logn) |
최대값
과 최소값
을 빠르게 찾아내도록 만들어진 자료구조부모 노드의 키 값이 자식 노드의 키 값보다 크거나
같은 완전 이진 트리
부모 노드의 키 값이 자식 노드의 키 값보다 작거나
같은 완전 이진 트리
파이썬의 힙은 기본적으로 최소 힙으로 구성되어 있습니다.
import heapq
hq=[]
heapq.heappush(hq, 3)
heapq.heappush(hq, 10)
heapq.heappush(hq, 1)
heapq.heappush(hq, 0)
heapq.heappush(hq, 4)
# 값을 삭제할떄는
heapq.heappop(hq)
## 리스트를 힙으로 변환
hq=[9, 20, 1, 8, 5, 0]
heapq.heapify(hq)
heappush 됐을 떄 기준으로 트리로 그려보면 다음과 같다.
-1을 곱해 음수로 만들어주면 된다.
이후, pop할 때 다시 -1를 곱해 원래대로 양수로 만들어주면 최소힙을 최대힙으로 만들어 사용할 수 있다.import heapq
hq=[]
# 음수로 만들어주기
heapq.heappush(hq, -3)
heapq.heappush(hq, -10)
heapq.heappush(hq, -1)
heapq.heappush(hq, -0)
heapq.heappush(hq, -4)
Node와 Edge로 이루어진 자료구조
Tree의 특성을 이해하자
계층적 관계(Hierarchical Relationship)
을 표현하는 자료구조이다. 이 트리라는 자료구조는 표현에 집중한다. 무엇인가를 저장하고 꺼내야 한다는 사고에서 벗어나 트리라는 자료구조를 바라보자.가장 중요한 것은, 그래프
와 트리
의 차이가 무엇인가인데, 이는 사이클의 유무로 설명할 수 있습니다.
중위 순회(in-order)
왼쪽 하위 트리를 방문 후 Root를 방문하는 방식
후위 순회(post-order)
왼쪽 하위 트리부터 하위를 모두 방문 후 루트(Root)를 방문하는 방식
레벨 순회(level-order)
루트(Root)부터 계층 별
로 방문하는 방식이다.
https://gyoogle.dev/blog/computer-science/data-structure/Heap.html
https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html