190 likes | 810 Views
8 장 . 우선순위 큐와 히프 (heap) 1 절 . 우선순위 큐 2 절 . 히프. 이 완 직 ( wjlee@pnu.ac.kr ) 2010 년 1 학기. 1. 우선순위 큐. 큐에 우선순위의 개념을 확장 데이터 자체의 우선순위에 따라서 먼저 처리할 것을 결정. 1.1 우선순위 큐 구현 방법. 배열을 이용한 우선순위 큐 정렬이 안된 배열로 구현 삽입이 무척 간단 . 삭제 시 , 우선순위가 높은 요소를 찾아야 하기에 삭제의 시간복잡도는 O(N). 정렬된 배열로 구현
E N D
8장. 우선순위 큐와 히프(heap) 1절. 우선순위 큐 2절. 히프 이 완 직 (wjlee@pnu.ac.kr) 2010년 1학기
1. 우선순위 큐 • 큐에 우선순위의 개념을 확장 • 데이터 자체의 우선순위에 따라서 먼저 처리할 것을 결정
1.1 우선순위 큐 구현 방법 • 배열을 이용한 우선순위 큐 • 정렬이 안된 배열로 구현 • 삽입이 무척 간단. • 삭제 시, 우선순위가 높은 요소를 찾아야 하기에 삭제의 시간복잡도는 O(N). • 정렬된 배열로 구현 • 이진 탐색과 같은 방법을 사용하고 삽입 위치 뒤에 있는 요소들을 이동시켜서 빈자리를 만든 후에 삽입하기에 시간복잡도는 O(N). • 삭제는 간단.
1.1 우선순위 큐 구현 방법 • 연결 리스트를 이용한 우선순위 큐 • 정렬이 안된 리스트로 구현 • 첫번째 노드로 삽입시키기에는 시간복잡도가 (1)이지만 • 삭제를 위해 가장 큰 레코드를 찾는데 걸리는 시간복잡도는 O(N). • 정렬된 리스트로 구현 • 우선순위가 가장 높은 레코드를 헤드 포인터가 직접 가리키기 때문에 삭제를 위한 시간복잡도는 O(1) • 삽입함수는 키값을 기준으로 삽입 위치를 찾아야 하므로 최악의 경우 마지막에 위치할 경우를 감안하면 시간복잡도는 O(N).
1.1 우선순위 큐 구현 방법 • 히프를 이용한 우선순위 큐 • 히프는 우선순위 큐를 만들기 위한 자료구조로 완전 이진 트리 모습을 하고 있다. • 각 구현 방법에 대한 비교
2. 히프(heap) • 히프(heap)의 사전적인 의미:(쌓아 올린)더미, 덩어리, 무더기 • 자료구조에서의 히프 • 완전 이진 트리로 구현된 더미와 유사한 구조의 자료구조로서, 노드 중에서 키값이 가장 큰 노드나 키값이 가장 작은 노드를 찾기 위해서 만들어졌다.
2. 히프(heap) • 최대 히프(max heap) • 키값이 가장 큰 노드를 찾기 위한 완전 이진 트리로 루트 노드는 키값이 가장 큰 노드. • 부모 노드의 키값은 자식 노드의 키값 보다 크거나 같다. • 최소 히프(min heap) • 키값이 가장 작은 노드를 찾기 위한 완전 이진 트리로 루트 노드는 키값이 가장 작은 노드. • 부모 노드의 키값이 자식 노드의 키값보다 작거나 같다. 최대 히프의 조건 : key(부모 노드) ≥ key(자식 노드) 최소 히프의 조건 : key(부모노드) ≤ key(자식노드)
2. 히프(heap) 최대 히프와 최소 히프의 비교 히프가 아닌 트리의 예
2.1 히프의 구현 • 우선순위 큐를 구현을 위한 연산자 • 배열을 이용한 히프의 구현 • 히프는 배열로 표현하는 것이 가장 효율적이다. • 히프가 배열에 저장되어 있다면 특정 노드의 자식 노드를 찾기가 쉽다. • 왼쪽 자식: 노드 인덱스*2 • 오른쪽 자식: 노드 인덱스*2+1 • 부모: 노드 인덱스/2
2.1 히프의 구현 • 최대 히프의 배열 구현 예 • 구현 자료구조 정의 • typedef struct { • int heap[MAX_ELEMENT]; • int heap_size; • } HeapType;
2.2 히프의 삽입 연산 • 히프에 새로운 노드가 추가되면 • 일단 새로운 노드를 히프의 마지막 노드에 이어서 삽입. • 삽입한 후에 새로운 노드를 부모 노드들과 교환해서 히프의 성질을 만족시킴(Up Heap/Promotion).
2.2 히프의 삽입 연산 • 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; • }
2.3 히프의 삭제 연산 • 우선 순위가 가장 큰 루트 노드 값 리턴 • 배열 마지막 노드를 루트 노드 위치에 이동. • 히프 성질을 만족하도록, 루트에서부터 단말 노드까지의 경로에 있는 노드들을 교환(Down Heap)
2.3 히프의 삭제 연산 • 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; • }