4. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
5. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
6. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
7. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
8. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
9. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
10. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
11. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
12. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
13. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
14. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
15. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
16. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
17. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
18. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
19. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
20. 우선순위 큐란?
큐지만 들어간 데이터의 순서와 상관없이
우선순위가 높은 데이터가 먼저 나가는 큐!
예를 들어 병원이 있다.
병원을 이용하기 위해 손님들이 찾아온다.
그리고 하나 둘 병원에 들어가는데.
이때 응급환자가 실려온다.
환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다.
39. 힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
40. 힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
41. 힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
42. 힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
배열을 이용하여 구현한다!
그리고 배열의 0번은 비워둔다! 그 이유는 뒤에!
43. 힙(Heap) - 1
• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다.
• 하지만 그건 우선 여기서는 패스!!!
• 우리에게 필요한 것은 완전 이진 트리다.
• 뭐? 완전 이진 트리???
5
12 8
16 14 9 11
중간에 빈 곳 없이 채워진 트리!!
배열을 이용하여 구현한다!
그리고 배열의 0번은 비워둔다! 그 이유는 뒤에!
1
2 3
4 5 6 7
5 12 8 16 14 9 11
1 2 3 4 5 6 70
44. • 2종류의 힙 과 그 속성
• MAX heap
부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리
• MIN heap
부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리
힙(Heap) - 2
0
8 12
16 14 21 14
MIN heap
20
9 10
8 7 4 2
MAX heap
45. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
46. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
i
47. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
i
48. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
i
49. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
50. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
4 = i(2)*2
51. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
52. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
5 = i(2)*2+1
53. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i
54. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
i이제 i를 각각 4와 5라 생각해보자
55. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
56. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
57. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
그리고 각각 자식들의 부모 값 2
i(4)/2 = 2
i(5)/2 = 2 (int로 받아서 나머지 값 무시!)
58. • 부모와 자식의 관계
우선 MIN heap으로 구현을 생각하고 설명한다.
노드 i 가 있다. (i를 2라고 생각해보자)
(힙에서는 1번 노드가 배열 1부터 시작!)
힙(Heap) - 3
1
2 3
4 5 6 7
8
2의 자식은 4와 5가 있다.
왼쪽 자식 4 = i(2)*2
오른쪽 자식 5 = i(2)*2+1
이제 i를 각각 4와 5라 생각해보자
i
그리고 각각 자식들의 부모 값 2
i(4)/2 = 2
i(5)/2 = 2 (int로 받아서 나머지 값 무시!)
이 계산을 편히 하기 위하여
배열의 0번을 비워두었다!!!
59. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
60. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
우선 1의 키 값을 가진 노드를 삽입
61. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1의 키 값을 가진 노드를 삽입
62. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
63. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2 3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
64. • 삽입 연산
들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다.
힙(Heap)의 연산 - 1
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1의 키 값을 가진 노드를 삽입
부모 노드와 키 값을 비교하여 교환
65. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
66. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
67. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
68. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
69. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
70. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
71. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
72. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2
37
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
73. • 삭제 연산
가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음
으로 보낸 후 자식 노드와 비교하여 재정렬한다.
힙(Heap)의 연산 - 2
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1번 노드 제거
제일 마지막 노드를 1번 노드로 이동
자식 노드와 키 값을 비교하여 교환
75. 구현을 위한 설계
• C++를 이용한 구현.
PriorityQueue Class를 만들자.
• 노드 배열의 위치를 기억하기 위한 n을 사용하자
int n =1; 배열의 시작은 1이기 때문에 n은 1부터 시작!
• 배열을 이용하는데 data와 key값이 필요하니 구조체 배열을 이용하자!
struct Node{
string data;
int key;
}; 그리고 구조체 배열을 정적으로 100개 할당하고 시작! Node heap[100]
• 데이터를 삽입하기 위한 Push()와 Pop()을 그리고 출력을 위한 Show() !
void Push() void Pop() void Show()
• Push에는 data와 key값을 받을 수 있게 하자!
void Push(string data, int key)
• 노드 비교 후 교환을 위한 Swap을 노드를 참조하여 교환 하자
Swap(Node &a, Node &b);