15
이 이 이 ([email protected] ) 2010 이 1 이이 8 장 . 장장장장 장장 장장 (heap) 1 장 . 장장장장 장 2 장 . 장장

8 장 . 우선순위 큐와 히프 (heap) 1 절 . 우선순위 큐 2 절 . 히프

Embed Size (px)

DESCRIPTION

8 장 . 우선순위 큐와 히프 (heap) 1 절 . 우선순위 큐 2 절 . 히프. 이 완 직 ( [email protected] ) 2010 년 1 학기. 1. 우선순위 큐. 큐에 우선순위의 개념을 확장 데이터 자체의 우선순위에 따라서 먼저 처리할 것을 결정. 1.1 우선순위 큐 구현 방법. 배열을 이용한 우선순위 큐 정렬이 안된 배열로 구현 삽입이 무척 간단 . 삭제 시 , 우선순위가 높은 요소를 찾아야 하기에 삭제의 시간복잡도는 O(N). 정렬된 배열로 구현 - PowerPoint PPT Presentation

Citation preview

Page 1: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

이 완 직 ([email protected])2010 년 1 학기

8 장 . 우선순위 큐와 히프(heap)

1 절 . 우선순위 큐2 절 . 히프

Page 2: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 큐에 우선순위의 개념을 확장• 데이터 자체의 우선순위에 따라서 먼저 처리할 것을 결정

1. 우선순위 큐

2

Page 3: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 배열을 이용한 우선순위 큐– 정렬이 안된 배열로 구현

• 삽입이 무척 간단 .• 삭제 시 , 우선순위가 높은 요소를 찾아야 하기에 삭제의

시간복잡도는 O(N).

– 정렬된 배열로 구현• 이진 탐색과 같은 방법을 사용하고 삽입 위치 뒤에 있는 요소들을

이동시켜서 빈자리를 만든 후에 삽입하기에 시간복잡도는 O(N). • 삭제는 간단 .

1.1 우선순위 큐 구현 방법

3

Page 4: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 연결 리스트를 이용한 우선순위 큐– 정렬이 안된 리스트로 구현

• 첫번째 노드로 삽입시키기에는 시간복잡도가 (1) 이지만 • 삭제를 위해 가장 큰 레코드를 찾는데 걸리는 시간복잡도는 O(N).

– 정렬된 리스트로 구현• 우선순위가 가장 높은 레코드를 헤드 포인터가 직접 가리키기

때문에 삭제를 위한 시간복잡도는 O(1)• 삽입함수는 키값을 기준으로 삽입 위치를 찾아야 하므로 최악의

경우 마지막에 위치할 경우를 감안하면 시간복잡도는 O(N).

1.1 우선순위 큐 구현 방법

4

Page 5: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 히프를 이용한 우선순위 큐– 히프는 우선순위 큐를 만들기 위한 자료구조로 완전 이진 트리

모습을 하고 있다 .

• 각 구현 방법에 대한 비교

1.1 우선순위 큐 구현 방법

5

Page 6: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 히프 (heap) 의 사전적인 의미 : ( 쌓아 올린 ) 더미 , 덩어리 , 무더기

• 자료구조에서의 히프– 완전 이진 트리로 구현된 더미와 유사한 구조의 자료구조로서 ,

노드 중에서 키값이 가장 큰 노드나 키값이 가장 작은 노드를 찾기 위해서 만들어졌다 .

2. 히프 (heap)

6

Page 7: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 최대 히프 (max heap) – 키값이 가장 큰 노드를 찾기 위한 완전 이진 트리로 루트 노드는

키값이 가장 큰 노드 . – 부모 노드의 키값은 자식 노드의 키값 보다 크거나 같다 .

• 최소 히프 (min heap) – 키값이 가장 작은 노드를 찾기 위한 완전 이진 트리로 루트

노드는 키값이 가장 작은 노드 .– 부모 노드의 키값이 자식 노드의 키값보다 작거나 같다 .

2. 히프 (heap)

7

최대 히프의 조건 : key( 부모 노드 ) ≥ key( 자식 노드 )

최소 히프의 조건 : key( 부모노드 ) ≤ key( 자식노드 )

Page 8: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

2. 히프 (heap)

8

최대 히프와 최소 히프의 비교

히프가 아닌 트리의 예

Page 9: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 우선순위 큐를 구현을 위한 연산자

• 배열을 이용한 히프의 구현– 히프는 배열로 표현하는 것이 가장 효율적이다 .– 히프가 배열에 저장되어 있다면 특정 노드의 자식 노드를 찾기가

쉽다 .• 왼쪽 자식 : 노드 인덱스 *2• 오른쪽 자식 : 노드 인덱스 *2+1• 부모 : 노드 인덱스 /2

2.1 히프의 구현

9

Page 10: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 최대 히프의 배열 구현 예

• 구현 자료구조 정의

2.1 히프의 구현

10

typedef struct {int heap[MAX_ELEMENT];int heap_size;

} HeapType;

Page 11: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 히프에 새로운 노드가 추가되면 – 일단 새로운 노드를 히프의 마지막 노드에 이어서 삽입 . – 삽입한 후에 새로운 노드를 부모 노드들과 교환해서 히프의

성질을 만족시킴 (Up Heap/Promotion).

2.2 히프의 삽입 연산

11

Page 12: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

2.2 히프의 삽입 연산

12

void insertHeap(HeapType *h, int item){

int i;h->heap_size = h->heap_size +1; i = h->heap_size;while((i!=1) && (item > h->heap[i/2])){

h->heap[i] = h->heap[i/2]; i/=2;

}h->heap[i] = item;

}

Page 13: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• 우선 순위가 가장 큰 루트 노드 값 리턴• 배열 마지막 노드를 루트 노드 위치에 이동 . • 히프 성질을 만족하도록 , 루트에서부터 단말 노드까지의 경로에

있는 노드들을 교환 (Down Heap)

2.3 히프의 삭제 연산

13

Page 14: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

2.3 히프의 삭제 연산

14

int deleteHeap(HeapType *h){

int parent, child;int item, temp;item = h->heap[1]; temp = h->heap[h->heap_size]; h->heap_size = h->heap_size -1; parent = 1; child = 2;while(child <= h->heap_size) {

if((child < h->heap_size) && (h->heap[child]) < h->heap[child+1])

child++;if (temp >= h->heap[child])

break;h->heap[parent] = h->heap[child];parent = child;child = child*2;

}h->heap[parent] = temp;return item;

}

Page 15: 8 장 .  우선순위 큐와 히프 (heap) 1 절 .  우선순위 큐 2 절 .  히프

• [ 예제 8-1] 우선순위 큐를 위한 히프 구현

15