chap 8: 우선순위큐 - programming languages &...

28
Ch 8 우선순위 Chap 8: 우선순위 2008학년도 2학기 kkman@sangji.ac.kr Chap 8. 우선 순위 큐 -1- [email protected]

Upload: vuhanh

Post on 17-Sep-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Ch 8 우선순위 큐Chap 8: 우선순위 큐

2008학년도 2학기

[email protected]

Chap 8. 우선 순위 큐 - 1 [email protected]

1. 기본 개념

큐(queue)

~ 먼저 들어온 자료를 먼저 처리먼저 들어온 자료를 먼저 처리

우선순위 큐(priority queue)우선순위 큐(priority queue)

~ 우선순위가 더 높은 자료를 먼저 처리

FIFO 순서가 아니라 우선 순위가 높은 데이터가 먼저 처리~ FIFO 순서가 아니라 우선 순위가 높은 데이터가 먼저 처리

자료구조 삭제되는 요소자료구조 삭제되는 요소

스택 가장 최근에 들어온 데이터

큐 가장 먼저 들어온 데이터큐 가장 먼저 들어온 데이터

우선순위큐 가장 우선순위가 높은 데이터

Chap 8. 우선 순위 큐 - 2 [email protected]

우선순위 큐 구현 방법

구현방법, 교재 pp304-305 필독~ 배열을 이용한 우선순위 큐

~ 연결 리스트를 이용한 우선순위 큐

~ 히프(heap)를 이용한 우선순위 큐

Chap 8. 우선 순위 큐 - 3 [email protected]

힙(heap)

~ 우선순위 큐와 비슷한구체적인 자료구조, 완전 이진 트리우선순위 큐와 비슷한구체적인 자료구조, 완전 이진 트리

~ 우선 순위 설정 방법, 우선 순위 높은 자료 추출 등의 방법 포함

~ 큐 자료중 우선 순위가 가장 높은 자료를 선택큐 자료중 우선 순위가 가장 높은 자료를 선택

종류종류~ 최대 히프(max heap)

부모 노드의 키값이 자식 노드의 키값보다 크거나 같은 완전이진 트리

key(부모노드) ≥key(자식노드)

최소 히프(min heap)~ 최소 히프(min heap)

부모 노드의 키값이 자식 노드의 키값보다 작거나 같은 완전이진 트리

Chap 8. 우선 순위 큐 - 4 [email protected]

key(부모노드) ≤key(자식노드)

Chap 8. 우선 순위 큐 - 5 [email protected]

이진 힙(binary heap)

이진 힙 조건

~ 조건 1 : 완전 이진 트리(complete binary tree) 구조.조건 1 완전 이진 트리(complete binary tree) 구조.

~ 조건 2 : 부모 노드는 두 자식 노드보다 우선순위가 높다.

Chap 8. 우선 순위 큐 - 6 [email protected]

힙의 구현 방법

배열을 이용한 힙 구현~ 완전 이진트리의 각 노드에 번호를 부여.

~ 부연된 번호를 배열의 인덱스로 간주

왼쪽 자식의 인덱스 = (부모의 인덱스)*2

오른쪽 자식의 인덱스 (부모의 인덱스) 2 1오른쪽 자식의 인덱스 = (부모의 인덱스)*2 + 1

부모의 인덱스 = (자식의 인덱스)/2

Chap 8. 우선 순위 큐 - 7 [email protected]

Chap 8. 우선 순위 큐 - 8 [email protected]

완전 이진 트리의 구현~ 배열을 이용한 레벨 순서 순회(level order traverse) 방법

Chap 8. 우선 순위 큐 - 9 [email protected]

배열, 부모 노드와 자식 노드 관계

~ 왼쪽 자식 = 부모 노드 * 2 + 1왼쪽 자식 부모 노드 2 1

~ 오른쪽 자식 = 부모 노드 * 2 + 2

~ 부모 노드 = (왼쪽 자식 – 1) / 2부모 노드 (왼쪽 자식 1) / 2

~ 부모 노드 = (오른쪽 자식 – 2) / 2

Chap 8. 우선 순위 큐 - 10 [email protected]

힙 구현 : 삽입 연산

개념~ 회사에서 신입 사원이 들어오면 일단 말단 위치에 앉힌 다음에,

신입 사원의 능력을 봐서 위로 승진시키는 것과 비숫

히프에 새로운 요소가 들어 오면, 일단 새로운 노드를 히프의 마지막 노드에 이어서 삽입막 에 이어서 삽입

삽입 후에 새로운 노드를 부모 노드들과 교환해서 히프의 성질을 만족

Chap 8. 우선 순위 큐 - 11 [email protected]

조건~ 적어도 삽입과 삭제의 두 가지 메소드 필요

~ 자료의 삽입 시 자료의 위치를 바꿔 트리의 루트에 우선순위가가장 높은 노드를 확보

이진 힙 삽입 알고리즘~ 단계 1 삽입할 자료를 트리의 마지막 위치에 넣는다~ 단계 1. 삽입할 자료를 트리의 마지막 위치에 넣는다.

~ 단계 2. 부모 노드와 우선순위를 비교하여 계속 반복.

2-1. 부모 노드의 우선순위가 더 높을 경우, 삽입 종료.

2-2. 부모 노드의 우선순위가 더 낮을 경우, 부모 노드와 교환

한 뒤 비교를 계속.

2 3 트리의 루트가 되면 삽입 동작 종료2-3. 트리의 루트가 되면 삽입 동작 종료.

Chap 8. 우선 순위 큐 - 12 [email protected]

Chap 8. 우선 순위 큐 - 13 [email protected]

Chap 8. 우선 순위 큐 - 14 [email protected]

입력 순서 : 5, 3, 8, 14, 4, 16, 1, 10, 11, 2, 6, 20

Chap 8. 우선 순위 큐 - 15 [email protected]

Chap 8. 우선 순위 큐 - 16 [email protected]

Chap 8. 우선 순위 큐 - 17 [email protected]

Chap 8. 우선 순위 큐 - 18 [email protected]

Chap 8. 우선 순위 큐 - 19 [email protected]

힙 구현 : 삭제 연산

개념~ 최대히프에서의 삭제는 가장 큰 키값을 가진 노드를 삭제

~ 회사에서 사장의 자리가 비게 되면 먼저 제일 말단 사원을 사장자리로 올린 다음에, 능력에 따라 강등시키는 것과 비숫.

루트 노드를 삭제 마지막 노드를 루트 노드로 이동루트 노드를 삭제, 마지막 노드를 루트 노드로 이동

루트에서부터 단말노드까지의 경로에 있는 노드들을 교환하여 힙 성질 만족.

Chap 8. 우선 순위 큐 - 20 [email protected]

이진 힙 삭제 알고리즘~ 단계 1. 루트 노드 삭제

~ 단계 2. 힙의 마지막 노드를 루트 노드 자리로 이동

~ 단계 3. 자식 노드들과 우선순위를 비교

3 1 두 자식 노드의 우선순위가 더 낮을 경우 삭제 종료3-1. 두 자식 노드의 우선순위가 더 낮을 경우, 삭제 종료

3-2. 우선순위가 더 높은 자식 노드가 있을 경우, 두 자식 노드 중 우선순위가 더 높은 노드와 교환한 뒤 다시 비교중 우선순위가 더 높은 와 환한 뒤 다시 비

3-3. 자식을 갖지 않는 잎(leaf) 노드가 될 경우, 삭제 종료

Chap 8. 우선 순위 큐 - 21 [email protected]

Chap 8. 우선 순위 큐 - 22 [email protected]

Chap 8. 우선 순위 큐 - 23 [email protected]

Chap 8. 우선 순위 큐 - 24 [email protected]

응용 : 힙 정렬(Heap sort)

개요~ 삭제를 수행할 때마다 우선순위가 가장 높은 루트 노드를 반환

~ 반환 받은 노드를 별도의 배열에 순서대로 저장하여 정렬 수행

~ 단점

힙에 사용된 배열 외에 별도의 메모리 필요힙에 사용된 배열 외에 별도의 메모리 필요

비교적 느린 속도

효율적인 메모리 관리~ 삭제된 자료를 별도의 배열에 저장하는 것이 아니라, 삭제된 자 를 별 의 배열에 저장하는 것이 아니라,

~ 힙에서 삭제되면서 생긴 빈 공간에 기록

Chap 8. 우선 순위 큐 - 25 [email protected]

Chap 8. 우선 순위 큐 - 26 [email protected]

Chap 8. 우선 순위 큐 - 27 [email protected]

// 우선 순위 큐인 히프를 이용한 정렬

void heap_sort(element a[], int n)

{

int i;t ;

HeapType h;

i it(&h)init(&h);

for(i=0;i<n;i++){

insert_max_heap(&h, a[i]);

}

for(i=(n-1);i>=0;i--){

a[i] = delete max heap(&h);a[i] = delete_max_heap(&h);

}

}

Chap 8. 우선 순위 큐 - 28 [email protected]