쉬운코드님 강의들 듣고 정리했습니다! 문제 시 삭제할게요
- 큐와 유사하지만 우선순위가 높은 아이템이 먼저 처리됨
- insert : 아이템 우선 순위 순으로 넣어줌
- delete : 가장 우선 순위가 높은 것을 빼냄
- peek : delete와 같지만 우선순위 큐에서 제거는 안함
- delete를 호출하면 우선순위가 가장 높은 20이 사라지게 됨
- 두 번째로 delete를 호출하면 우선순위가 높은 10이 사라지게 됨
- 주로 이진 트리 기반으로 구현이 됨
트리(tree)
: 부모 - 자녀처럼 계층적인 형태를 가지는 구조이진 트리
: 자녀가 최대 두 개인 트리
- 부모 노드의 키가 자식 노드의 키보다 크거나 같은 트리
- 서브트리도 마찬가지로 적용되어야 함
- max heap의 반대
- insert : 힙의 아이템을 집어넣을 때 키값도 같이 넣어줘야 함
- delete : 키 값이 가장 큰 값을 빼냄
- peek : delete와 같지만 꺼내지는 않는다.
- max heap에서 inert(17)하면 11번째 공간에 일단 17이라는 값을 넣음
- 부모보다 더 크기 때문에 3이랑 스위칭
- 15와 또 비교해줌
- 20이랑 비교 후 자리 안 바꿔도 돼서 끝이 남
- 루트 노드의 키 값이 트리 중에 가장 큼 ⇒ 삭제를 할 때 루트 노드가 사라짐
- 그럼 뭐를 루트노드로 올릴까?
- 그리고 max heap을 유지시켜주기 위해 자녀와 비교해서 체인지 해줘야 함
- 15, 11모두 2보다 크기에 그 중 더 큰 15를 루트 노드로 올림
- 또 자녀와 비교
- 12, 3 모두 2보다 큰데 12가 더 크기 때문에 12와 체인지
- 마찬가지 자녀와 비교
- 7과 5모두 2보다 큰데 그 중 더 큰 7을 위로 올린다.
- 힙(Heap)의 키(key)를 우선순위(priority)로 사용한다면, 힙은 우선순위 큐(priority queue)의 구현체가 된다.
- Priority queue = ADT(구현을 설정하지 않고 개념적인 것만 설명)
- 추상 자료형(abstract data type)
추상 자료형
은 구현 방법을 명시하고 있지 않다는 점에서 자료 구조와 다르다. 비슷한 개념의 추상적 자료 구조는 각 연산의 시간 복잡도를 명기하고 있지만 추상적 자료형에서는 이것조차 명기하지 않는다.- 추상 자료형은 인터페이스와 구현을 분리하여 추상화 계층을 둔 것이다. 예를 들어 전기 밥솥을 추상 자료형에 비유한다면 그 속에 들어가는 밥은 자료가 되고, 밥솥에 있는 취사, 예약취사 버튼들과 남은 시간을 표시하는 디스플레이에 어떤 내용들이 표시되어야 하는지를 명기한 것이다.
- Heap = data structure(구현까지 있음)
- 우선순위 큐를 구현하기 위해 다양한 것들이 있겠지만, 힙을 대체로 많이 사용해서 동일시 하는 사람들이 있다.
- cpu에서 현재 동작하고 있는 프로세스가 p1이라면 p2, p3, p4는 대기해야 하는데 대기할 때,
ready queue
에 대기한다. - 근데 ready queue가 FIFO이 아니라 우선순위 큐라면 P1이 cpu 작업을 다 끝냈을 때, 들어온 순이 아니라 우선순위가 높은 애가 먼저 작업을 하게 됨
- 정렬 n개의 아이템 ⇒ 힙에 다 넣어서 차례차례 delete() 시 정렬되어서 나오게 됨
- No, 힙 메모리의 힙은 오늘 배운 힙과는 관련이 없다
- 힙 메모리의 힙은 메모리에 있는 더미 느낌
- 스택 메모리의 단점 보완
- 수명 : 스택 메모리의 경우 함수가 반환되는 순간 그 안에 있던 데이터가 다 날라가며, 전역 변수는 언제나 살아있고, 지역 변수는 함수 안에서만 유효
- 크기 : 스택메모리는 특정 용도로 떼어놓은 것이라 크기가 작다. 용량의 제한적
- 힙 메모리의 장점[unmanaged]
- 크기 : 컴파일러 및 CPU가 자동적으로 메모리 관리를 안 해주기 때문에 프로그래머가 원하는 때, 원하는 만큼 메모리 할당받아와 사용하고 원할 때 반납(해제) 할 수 있다.
- 용량 제한 없음 : 프로그래머가 데이터의 수명을 직접 제어할 수 있어, 컴퓨터에 남아있는 메모리만큼 사용 가능 ⇒ 호출이 끝난다고 사라지지 않는다.
- 힙 메모리의 단점
- 메모리 누수 위험성 있음 : 매니지드 언어인 JAVA는 메모리 할당받을 때 new 키워드 사용하며, 사용 후에는 해제 신경을 안쓴다. 메모리 해제를 알아서 해주기 때문이다. 하지만 c는 언매니지드라 프로그래머가 직접 해줘야 한다.
- 스택에 비해 할당/해제 속도가 느림 : 함수가 요청한 만큼의 크기 빈 공간을 찾으려고 이리저리 찾아야 한다.
스택 메모리 | 힙 메모리 |
---|---|
정적 메모리 | 동적 메모리 |
오픈셋 개념으로 정확히 몇 바이트씩 사용해야 하는지 컴파일 시 결정 | 실행 중에 크기와 할당/해제 시기가 결정됨 |