Upload
kwangil-kim
View
122
Download
0
Embed Size (px)
Citation preview
큐는 알겠는데우선순위 큐가 뭐지 ?
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .
우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !
예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .
다시 한 번 설명 한다 . 집중해서 보자 !
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2 13
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2 13 7
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2 13 7 9
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2 13 7 9 15
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
1 12 2 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다 .
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
12 2 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다 .
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
12 13 7 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다 .
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
12 13 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다 .
다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .
12 13 9 15
낮은 숫자가 우선순위가 높다고 가정하고 데이터를 출력합니다 .
이제 우리는 우선순위 큐가 무엇인지 알게 되었습니다 .
이제 우선순위 큐가 뭔지는 알겠다 .
그래서 구현은 어떻게 하지 ?
우선순위 큐의 구현 힙 (Heap)• 우선순위 큐는 배열과 연결리스트를 이용해서 구현은 가능하다 . 하지만 우선순위를 알 수 있는 키 (key) 값을 찾기 위해서 전체를 탐색함으로 매우 비효율적이다 .
• 그래서 힙을 이용한 구현을 한다 .
아니 우선순위 큐를 구현하려 했더니 힙 (Heap) 이라니 이게 무슨 소리요 !!!
힙 (Heap) - 1• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다 .• 하지만 그건 우선 여기서는 패스 !!!• 우리에게 필요한 것은 완전 이진 트리다 .• 뭐 ? 완전 이진 트리 ???
힙 (Heap) - 1• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다 .• 하지만 그건 우선 여기서는 패스 !!!• 우리에게 필요한 것은 완전 이진 트리다 .• 뭐 ? 완전 이진 트리 ???
5
12 8
16
14 9 1
1
힙 (Heap) - 1• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다 .• 하지만 그건 우선 여기서는 패스 !!!• 우리에게 필요한 것은 완전 이진 트리다 .• 뭐 ? 완전 이진 트리 ???
5
12 8
16
14 9 1
1
중간에 빈 곳 없이 채워진 트리 !!
힙 (Heap) - 1• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다 .• 하지만 그건 우선 여기서는 패스 !!!• 우리에게 필요한 것은 완전 이진 트리다 .• 뭐 ? 완전 이진 트리 ???
5
12 8
16
14 9 1
1
중간에 빈 곳 없이 채워진 트리 !!배열을 이용하여 구현한다 !그리고 배열의 0번은 비워둔다 ! 그 이유는 뒤에 !
힙 (Heap) - 1• 우리는 이진 탐색을 배우면서 이진 트리를 익혔다 .• 하지만 그건 우선 여기서는 패스 !!!• 우리에게 필요한 것은 완전 이진 트리다 .• 뭐 ? 완전 이진 트리 ???
5
12 8
16
14 9 1
1
중간에 빈 곳 없이 채워진 트리 !!배열을 이용하여 구현한다 !그리고 배열의 0번은 비워둔다 ! 그 이유는 뒤에 !
1
2 3
4 5 6 7 5 12 8 16 14 9 111 2 3 4 5 6 70
• 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
• 부모와 자식의 관계우선 MIN heap 으로 구현을 생각하고 설명한다 .노드 i 가 있다 . (i 를 2 라고 생각해보자 )( 힙에서는 1 번 노드가 배열 1 부터 시작 !)
힙 (Heap) - 3
1
2 3
4 5 6 7
8
• 부모와 자식의 관계우선 MIN heap 으로 구현을 생각하고 설명한다 .노드 i 가 있다 . (i 를 2 라고 생각해보자 )( 힙에서는 1 번 노드가 배열 1 부터 시작 !)
힙 (Heap) - 3
1
2 3
4 5 6 7
8
i
• 부모와 자식의 관계우선 MIN heap 으로 구현을 생각하고 설명한다 .노드 i 가 있다 . (i 를 2 라고 생각해보자 )( 힙에서는 1 번 노드가 배열 1 부터 시작 !)
힙 (Heap) - 3
1
2 3
4 5 6 7
8
2 의 자식은 4 와 5 가 있다 .
i
• 부모와 자식의 관계우선 MIN heap 으로 구현을 생각하고 설명한다 .노드 i 가 있다 . (i 를 2 라고 생각해보자 )( 힙에서는 1 번 노드가 배열 1 부터 시작 !)
힙 (Heap) - 3
1
2 3
4 5 6 7
8
2 의 자식은 4 와 5 가 있다 .
i
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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 라 생각해보자
• 부모와 자식의 관계우선 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 라 생각해보자
• 부모와 자식의 관계우선 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
• 부모와 자식의 관계우선 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그리고 각각 자식들의 부모 값 2i(4)/2 = 2i(5)/2 = 2 (int 로 받아서 나머지 값 무시 !)
• 부모와 자식의 관계우선 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그리고 각각 자식들의 부모 값 2i(4)/2 = 2i(5)/2 = 2 (int 로 받아서 나머지 값 무시 !)이 계산을 편히 하기 위하여배열의 0 번을 비워두었다 !!!
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
우선 1 의 키 값을 가진 노드를 삽입
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1 의 키 값을 가진 노드를 삽입
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8 19
우선 1 의 키 값을 가진 노드를 삽입부모 노드와 키 값을 비교하여 교환
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2 3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1 의 키 값을 가진 노드를 삽입부모 노드와 키 값을 비교하여 교환
• 삽입 연산들어온 노드의 키 값을 보고 부모 노드와 비교 후 위치를 바꾼다 .
힙 (Heap) 의 연산 - 1
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
우선 1 의 키 값을 가진 노드를 삽입부모 노드와 키 값을 비교하여 교환
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
0
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1 번 노드 제거
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1 번 노드 제거
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
9
가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
3
7
8 5 12
10
1
2 3
4 5 6 7
8
1
가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동자식 노드와 키 값을 비교하여 교환
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2
37
8 5 12
10
1
2 3
4 5 6 7
8
1가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동자식 노드와 키 값을 비교하여 교환
• 삭제 연산가장 큰 키값을 가진 노드를 삭제하고 제일 마지막에 있는 노드를 맨 처음으로 보낸 후 자식 노드와 비교하여 재정렬한다 .
힙 (Heap) 의 연산 - 2
2 3
7 8 5 12
10
1
2 3
4 5 6 7
8
1가장 큰 키 값을 가진 1 번 노드 제거제일 마지막 노드를 1 번 노드로 이동자식 노드와 키 값을 비교하여 교환
이제 우선순위 큐에 필요한 정보를 모두 알았으니이제 구현을 해봅시다 !
Go
Go
구현을 위한 설계• 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);
End