OnePointLesson PriorityQueue 우선순위 큐

Post on 15-Apr-2017

119 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

Transcript

우선순위 큐(Priority Queue)동명대학교 게임공학과 김광일

rlarhk123@gmail.com

http://blog.naver.com/4ror-ing

큐는 알겠는데우선순위 큐가 뭐지 ?

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .

우선순위 큐란 ? 큐지만 들어간 데이터의 순서와 상관없이 우선순위가 높은 데이터가 먼저 나가는 큐 !

예를 들어 병원이 있다 .병원을 이용하기 위해 손님들이 찾아온다 .그리고 하나 둘 병원에 들어가는데 .이때 응급환자가 실려온다 .환자의 상태는 심각하기 때문에 다른 손님보다 우선순위를 가지고 먼저 들어간다 .

다시 한 번 설명 한다 . 집중해서 보자 !

다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .

다시 한 번 설명 한다 . 집중해서 보자 !우선 큐에 데이터를 채웁니다 .

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

top related