Internet Computing Laboratory @ KUT Youn-Hee Han 11장. 우선순위 큐 Internet Computing Laboratory @ KUT Youn-Hee Han
1. 우선순위 큐 개요 응급실에서 환자 치료의 예 Priority Queue 큐: 먼저 온 사람을 먼저 치료 스택: 나중에 온 사람을 먼저 치료 우선순위 큐 (Priority Queue) : 우선순위가 높은 사람 (예: 위급한 사람)을 먼저 치료 Priority Queue an abstract data type supporting the following three operations: - add an element to the queue with an associated priority - Remove and return the element from the queue that has the highest priority - (optionally) peek at the element with highest priority without removing it Data Structure
1. 우선순위 큐 개요 우선순위 우선순위 큐는 스택이나 큐 보다 일반적인 구조 시간: 스택, 큐 스택, 큐에서는 시간에 따라 자료구조를 조직화 시간을 포함한 여러 가지 가치를 우선순위로 가지는 자료구조 우선순위 큐 우선 순위 큐는 키 (= 우선순위 값) 필드가 필요. 그 키 값을 태그 (Tag, 꼬리표)라고도 함 우선순위 큐는 스택이나 큐 보다 일반적인 구조 큐나 스택은 우선순위 큐의 특수한 형태로서 시간에 그 우선순위를 부여한 것임 따라서 키 필드가 불필요 Priority Queue Stack Queue Data Structure
2. 추상 자료형 우선순위 큐 작업 삭제작업 Create: 새로운 우선순위 큐를 만들기 Destroy: 사용되던 우선순위 큐를 파기하기 Add: 현재 우선순위 큐에 새로운 레코드를 삽입하기 Remove: 가장 우선순위가 높은 레코드를 삭제하기 IsEmpty: 현재 우선순위 큐가 비어있는지 확인하기 Retrieve: 가장 우선순위가 높은 레코드를 보기 삭제작업 어떤 레코드가 우선순위가 가장 높은지는 큐 자체가 알고 있으므로 호출 함수 쪽에서는 아무런 파라미터를 넘길 필요가 없다. Data Structure
3. 배열, 연결 리스트, 트리에 의한 구현 정렬된 배열 정렬 안 된 배열 우선순위를 기준으로 오름차순으로 정렬 가장 우선순위가 큰 레코드는 항상 배열의 마지막에 위치 Remove는 마지막 레코드를 리턴, 배열 레코드의 개수를 하나 줄임 정렬 안 된 배열 새로운 레코드를 무조건 배열 끝에 붙임 삽입의 효율은 O(1), 삭제의 효율은 O(N) - 처음부터 끝까지 뒤져야 함. 정렬된 배열과 정렬 안 된 배열을 사용할 때의 삽입, 삭제 효율은 서로 정 반대의 성격을 지님 삭제가 빨라야 한다면 정렬된 배열, 삽입이 빨라야 한다면 정렬 안 된 배열 삭제와 삽입 모두를 감안한 효율은 O(1)+O(N)=O(N)이다. Data Structure
3. 배열, 연결 리스트, 트리에 의한 구현 연결 리스트에 의한 구현 - 우선순위를 기준으로 내림차순으로 정렬 우선순위가 가장 높은 레코드를 헤드 포인터가 직접 가리킴. 삭제시간은 O(1) 삽입 함수는 키 값을 기준으로 삽입위치를 찾아야 함. 최악의 경우 마지막 위치. O(N) 배열처럼 이동은 불필요. 삭제와 삽입 모두를 감안한 효율은 O(1)+O(N)=O(N)이다. Data Structure
3. 배열, 연결 리스트, 트리에 의한 구현 트리 (이진 탐색 트리, BST) 이용 효율 가장 큰 키 값을 지닌 노드 루트로부터 출발해서 RChild를 계속 따라 감. 상대적으로 Remove 하기 쉬움 효율 삭제함수의 효율은 O(lgN). 루트로부터 리프까지 내려감. 삽입 위치를 찾아 리프 노드까지 내려가는데에도 역시 O(lgN) 효율은 O(logN) + O(logN) = O(logN). 단 균형 트리에 한함. Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙 (Heap)의 정의 항상 완전 이진트리 (Complete Binary Tree)로서 빈 트리거나, Root의 키가 왼쪽자식과 오른쪽 자식의 키보다 크거나 같다. 왼쪽 자식, 오른쪽 자식을 루트로 하는 서브트리도 Heap이다. 주의할 특징 왼쪽 자식과 오른쪽 자식 사이에는 어느 쪽 키가 크던 상관이 없다. Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 Definition of Heap a specialized complete binary tree-based data structure that satisfies the heap property. If B is a child node of A, then the heap property is that: key(A) ≥ key(B) A heap is a special kind of tree. It has two properties that are not generally true for other trees: [Completeness] - The tree is complete, which means that nodes are added from top to bottom, left to right, without leaving any spaces. [Heapness] - The item in the tree with the highest priority is at the top of the tree, and the same is true for every subtree. Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 Max Heap Min Heap 정렬 관점에서… 키 값이 큰 레코드가 우선순위가 높은 것으로 간주 루트노드의 키가 가장 크다. Min Heap Max Heap과 정 반대 키 값이 작을수록 우선순위가 높다. 예] 내신등급 정렬 관점에서… BST는 약한 의미로 정렬. 왼쪽 자식 키보다 오른쪽 자식 키가 크다. Heap도 약한 의미로 정렬. 부모의 키가 자식의 키보다 우선 순위가 높다 왼쪽 자식 키와 오른쪽 자식 키는 무관하다. Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙 (완전 이진 트리) 구현 배열로 표시하는 것이 효율적 배열에 위치하는 순서 루트부터 시작해서 위에서 아래로, 왼쪽에서 오른쪽으로 진행 Root 노드는 항상 배열 인덱스 0. 트리의 부모 자식 관계 다음의 배열 인덱스 연산으로 정의 인덱스 K에 있는 노드의 왼쪽 자식은 (2K + 1), 오른쪽 자식은 (2K + 2) 인덱스 K에 있는 노드의 부모 노드는 (K - 1) / 2 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙의 삭제 우선순위가 가장 큰 루트노드를 삭제 Down Heap (다운 힙) 루트를 직접 삭제하면 이후 힙을 재구성하는 것이 복잡 그래서, 배열 마지막 요소를 루트노드 위치로 옮김. Down Heap (다운 힙) 힙 모습의 복원(Heap Rebuilding) Reheap ! 루트로부터 시작해서 제자리를 찾기까지 굴러 떨어짐 왼쪽, 오른쪽 자식 모두를 비교해서 더 큰 것과 루트를 스와핑 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙의 삭제 배열 연산 효율 정령의 관점에서 힙이 BST보다 더 좋은 구조임. 배열의 마지막 레코드를 처음으로 복사하는 데 O(1) 최악의 경우 루트로부터 리프까지 굴러 떨어짐.. 비교의 횟수는 총 2lgN이 된다. 스와핑은 Temp = A, A = B, B = Temp라는 3번의 복사. 최악의 경우 비교시마다 스와핑이 일어날 경우 복사의 횟수는 3lgN 삭제 효율은 O(lgN) 정령의 관점에서 힙이 BST보다 더 좋은 구조임. 이진 탐색트리는 최악의 경우 연결 리스트와 유사. O(N)의 효율 Skewed Binary Tree (편향된 이진 트리) 힙은 완전 이진트리로서 균형 트리 균형 트리의 높이는 항상 lg(N)에 가까움 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙의 삽입 Up heap (업 힙) 또는 Promotion 효율 O(lgN) 삭제보다 비교 횟수가 적음 [힙의 삭제] “사장자리가 비면 말단 사원을 그 자리에 앉힌 다음, 바로 아래 부하직원보다는 능력이 좋다고 판단될 때까지 강등시키는 것(降等, Down Heap, Demotion)” [힙의 삽입] “신입사원이 오면 일단 말단 자리에 앉힌 다음, 능력껏 위로 진급시키는 것(進級, Up Heap, Promotion)” Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 효율비교 N1/2 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙 정렬 (Heap Sort) 힙에서 Remove를 가하면 키가 제일 큰 레코드가 빠져 나옴. 빈 트리가 될 때까지 계속적으로 삭제를 가함. 빠져 나온 레코드를 순차적으로 적어나가면 그것이 바로 정렬된 결과 Maxheap 이용: 내림 차순의 정렬 Minheap 이용: 오름 차순의 정렬 힙 구성(Heap Building or Heap Creation) 힙정렬을 위하여 가장 먼저 수행해야 할 작업 주어진 레코드로부터 일단 힙을 만들어야, 빼내 오면서 정렬이 가능 구성 방법 하향식(Top-down) 힙 구성 상향식(Bottom-up) 힙 구성 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 하향식 (Top-down) 힙 구성 빈 힙에서 출발하여 반복적으로 삽입에 의해서 힙을 구성 효율은 O(NlgN) 으로 증명됨 그러므로, 힙 정렬 = 힙 구성 O(NlgN) + 연속적인 Remove O(NlgN) Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 상향식 (Bottom-up) 힙 구성 레코드들이 위치한 순서대로 일단 Complete Binary Tree 구성 힙 구조가 되도록 재조정 Reheap! 가장 아래쪽부터 검사하되 오른쪽에서 왼쪽으로 진행 검사 대상 노드가 Heap Priority을 만족시키는지 검사 해당 노드와 그 아래쪽 노드 간의 키만 비교하여 스와핑 연속적으로 굴러 떨어짐이 발생할 수 있음 Down Heap 상향식 힙 구성 결과와 하향식 힙 구성 결과가 다를 수 있음 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 상향식 구성을 사용한 Heap Sort의 예 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 상향식 구성을 사용한 Heap Sort의 예 Data Structure
4. 힙(Heap)에 의한 우선순위 큐 구현 힙 구성 삭제 단계 따라서 힙 정렬은 O(NlgN) Quick vs. Merge vs. Heap Quick은 O(NlnN)을 보장 못함 Merge는 추가적인 공간 필요 Heap은 추가적인 공간 필요 없이 O(NlnN)을 보장 Data Structure