14. 히프와 우선순위 큐.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

문자코드 1 박 2 일 (4 조 ) 이경도 이준집 이수연 엄태규. 문자코드란 ? 문자나 기호를 컴퓨터로 다루기 위하여, 문자나 기호 하나하나에 할당 시키는 고유의 숫자를 말하는 것이다.
이진 나무 구조 강윤섭 2008년 5월 23일.
Part TCP / IP(계속) 3. IP 주소 4. IP 라우팅 5. 응용 프로토콜.
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ①.
10. 예외 처리.
DB 프로그래밍 학기.
DB 프로그래밍 학기.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 Slide 1 (of 20).
Ch.07-5 xml-rpc 사용하기 김상엽.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
쉽게 배우는 알고리즘 3장. 정렬Sorting
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
7장 이원 탐색 트리.
3. 배열.
Lesson 5. 레퍼런스 데이터형.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Lesson 9. 예외처리.
Lesson 6. 형변환.
제3장 스택과 큐.
P150 문제를 프로그래밍 할 것 Source file (헤더파일포함), 실행화면 (학번_이름_1.txt)
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Error Detection and Correction
제 11 장 다원 탐색 트리.
CHAPTER 5 트리(Tree).
자료구조: CHAP 7 트리(1) 순천향대학교 컴퓨터공학과 하 상 호.
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
CHAP 7: 트 리 (1) 한 성 대 학 교 정보통신공학과 봉 정 식.
13. 탐색 트리.
13. 연산자 오버로딩.
CHAP 10:그래프 (2) 순천향대학교 하상호.
JA A V W. 03.
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
자바 5.0 프로그래밍.
어서와 C언어는 처음이지 제14장.
Lesson 4. 수식과 연산자.
자료구조: CHAP 7 트리 –review 순천향대학교 컴퓨터공학과 하 상 호.
Tree & Heap SANGJI University Kwangman Ko
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
8장. 상호 배타적 집합의 처리.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
USN(Ubiquitous Sensor Network)
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
CACM 구현 public class CACM { public CACM(File file)
자바 5.0 프로그래밍.
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
알고리즘: 우선순위 큐(8장) 순천향대학교 컴퓨터 학부 하 상 호.
자료구조론 8장 큐(queue).
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
스케줄링 (Scheduling) 시스템 내부시간(time in the system): 스케줄링 문제
Chapter 10 데이터 검색1.
구조체(struct)와 공용체(union)
Numerical Analysis Programming using NRs
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
트리 (Logical) Data Structures Linear list Tree Graph Linear structures
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
제 7 장 우선순위큐.
우선순위 큐 & Heap Ref. C로 쉽게 풀어쓴 자료구조, 생능출판사, 2005.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
11. 트리.
Presentation transcript:

14. 히프와 우선순위 큐

14.1 히프 히프의 정의 히프화(heapify) 연산 리프-루트 경로를 따라가는 모든 키가 오름차순으로 되어 있는 완전 이진 트리 이러한 순서에 대한 제약은 어떤 키도 부모보다 크지 않다고 말하는 것과 동일함 이것은 히프를 그것의 키에 대한 ≤ 관계를 가지는 부분 순서로 만듦 히프화(heapify) 연산 히프 특성을 만족하도록 시이퀀스의 원소들을 재배열함 리프-루트 경로를 따라 인접해 있는 두 개 이상의 원소를 회전시킴

14.2 히프 알고리즘 히프화 연산 알고리즘 1. temp=x로 설정. 2. x가 리프가 아닌 동안, 단계 3-4를 수행. 3. y를 x의 큰 자식으로 설정. 4. 만일 y.key > x.key이면 단계 5-6을 수행. 5. y를 x로 복사. 6. x=y로 설정. 7. temp를 x로 복사.

히프화 경로

히프화 메소드 LISTING 14.1: The heapify() Method 1 void heapify(int[] a, int i, int n) { 2 int ai = a[i]; 3 while (i < n/2) { // a[i] is not a leaf 4 int j = 2*i + 1; // a[j] is ai’s left child 5 if (j+1 < n && a[j+1] > a[j]) ++j; // a[j] is ai’s larger child 6 if (a[j] <= ai) break; // a[j] is not out of order 7 a[i] = a[j]; // promote a[j] 8 i = j; // move down to next level 9 a[i] = ai; 10 }

히프 구축 알고리즘 ALGORITHM 14.2: The Build Heap Algorithm 입력 : 완전 이진 트리 T.    2. 왼쪽 서브트리에 대해 히프 구축 알고리즘 적용.    3. 오른쪽 서브트리에 대해 히프 구축 알고리즘 적용.    4. 루트에 대해 히프화 알고리즘 적용.

트리에 있는 각각의 내부 노드에 적용되는 히프화 연산

히프 구축 메소드 LISTING 14.2: The buildHeap() Method 1 void buildHeap(int[] a, int i, int n) { 2 if (i >= n/2) return; 3 buildHeap(a, 2*i+1, n); 4 buildHeap(a, 2*i+2, n); 5 heapify(a, i, n); 6 }

14.3 우선순위 큐 정의 원소의 우선순위에 삭제 연산이 수행되는 큐 어떤 것이 높은 우선순위를 가지는지 결정하기 위해 원소들 간의 비교가 가능하다는 것을 가정하고 있음 만일 일반적인 큐를 선입선출(first-in, first-out) 자료 구조(FIFO)로 생각한다면, 우선순위 큐는 최적입선출(best-in, first-out)인 자료 구조(BIFO)로 생각할 수 있음

PriorityQueue ADT 연산 우선순위 큐는 BIFO 접근 프로토콜을 유지하는 원소의 컬렉션임 1. Add: 주어진 원소를 큐에 삽입한다. 2. Best: 큐가 공백이 아니면, 최고 우선순위를 가지는 원소를 리턴한다. 3. RemoveBest: 큐가 공백이 아니면, 최고 우선순위를 가지는 원소를 삭제해서 리턴한다. 4. Size: 큐에 있는 원소의 수를 리턴한다. PriorityQueue ADT의 인터페이스

PriorityQueue 인터페이스 LISTING 14.3: A PriorityQueue Interface 1 public interface PriorityQueue { 2 public void add(Object object); 3 // POSTCONDITION: the given object is in this queue; 5 public Object best(); 6 // RETURN: the highest priority element in this queue; 7 // PRECONDITION: this queue is not empty; 9 public Object removeBest(); 10 // RETURN: the highest priority element in this queue; 11 // PRECONDITION: this queue is not empty; 12 // POSTCONDITION: the returned object is not in this queue; 14 public int size(); 15 // RETURN: the number of elements in this queue; 16 }

우선순위 큐에 80을 삽입

삽입 알고리즘 우선순위 큐를 위한 삽입 알고리즘 입력 : 완전 이진 트리 T와 새로운 노드 x. 후조건 : x가 T에 삽입됨. 1. 만일 T가 공백이면, T를 다시 x를 포함하는 단독 트리로 만들고, 리턴. 2. T의 마지막에 새로운 노드를 추가. 3. y=z.parent로 설정. 4. y.key<x.key인 동안, 단계 5-6을 수행. 5. z.key=y.key로 설정. 6. 만일 y가 루트가 아니라면, 단계 7-8을 수행. 7. z=y로 설정. 8. y=y.parent로 설정. 9. y.key=x.key로 설정하고 리턴.

HeapPriorityQueue 클래스 (1) LISTING 14.4: A HeapPriorityQueue Class 1 public class HeapPriorityQueue implements PriorityQueue { 2 private static final int CAPACITY = 100; 3 private Comparable[] a; 4 private int size; 5 6 public HeapPriorityQueue() { 7 this(CAPACITY); 8 } 9 10 public HeapPriorityQueue(int capacity) { 11 a = new Comparable[capacity]; 12 } 13

HeapPriorityQueue 클래스 (2) 14 public void add(Object object) { 15 if (!(object instanceof Comparable)) 16 throw new IllegalArgumentException(); 17 Comparable x = (Comparable)object; 18 if (size == a.length) resize(); 19 int i = size++; 20 while (i > 0) { 21 int j = i; i = (i-1)/2; 23 if (a[i].compareTo(x) >= 0) { 24 a[j] = x; return; 26 } 27 a[j] = a[i]; 28 } 29 a[i] = x; 30 }

HeapPriorityQueue 클래스 (3) 32 public Object best() { 33 if (size == 0) throw new java.util.NoSuchElementException(); 34 return a[0]; 35 } 37 public Object remove() { 38 Object best = best(); 39 a[0] = a[--size]; 40 heapify(0, size); 41 return best; 42 } 44 public int size() { 45 return size; 46 } 48 public String toString() { 49 if (size == 0) return "{}"; 50 StringBuffer buf = new StringBuffer("{" + a[0]); 51 for (int i = 1; i < size; i++) 52 buf.append("," + a[i]); 53 return buf + "}"; 54 }

HeapPriorityQueue 클래스 (4) 56 private void heapify(int i, int n) { 57 Comparable ai = a[i]; 58 while (i < n/2) { 59 int j = 2*i+1; 60 if (j+1 < n && a[j+1].compareTo(a[j]) > 0) ++j; 61 if (a[j].compareTo(ai) <= 0) break; 62 a[i] = a[j]; 63 i = j; 64 } 65 a[i] = ai; 66 } 68 private void resize() { 69 Comparable[] aa = new Comparable[2*a.length]; 70 System.arraycopy(a, 0, aa, 0, a.length); 71 a = aa; 72 } 73 }

HeapPriorityQueue 클래스의 테스팅 (1) LISTING 14.5: Testing the HeapPriorityQueue Class 1 public class TestHeapPriorityQueue { 3 public TestHeapPriorityQueue() { 4 PriorityQueue queue = new HeapPriorityQueue(); 5 int[] pages = {7,3,2,8,3,4,1,3}; 6 for (int i = 0; i < pages.length; i++) { 7 queue.add(new PrintJob(null, pages[i])); 8 System.out.println("queue: " + queue); 9 } 10 while (queue.size() > 0) { 11 System.out.println("queue.remove(): " + queue.remove()); 12 System.out.println("q: " + queue); 13 } 14 } 16 public static void main(String[] args) { 17 new TestHeapPriorityQueue(); 18 } 19 }

HeapPriorityQueue 클래스의 테스팅 (2) 21 class PrintJob implements Comparable { 22 private java.io.File file; 23 private int pages; 24 private String id; 25 private static int n = 100; 27 public PrintJob(java.io.File file, int pages) { 28 this.file = file; 29 this.pages = pages; 30 this.id = "ID" + n++; 31 } 33 public int compareTo(Object object) { 34 if (!(object instanceof PrintJob)) 35 throw new IllegalArgumentException(); 36 PrintJob that = (PrintJob)object; 37 return that.pages - this.pages; 38 } 40 public String toString() { 41 return id + "(" + pages + ")"; 42 } 43 }

출력 출력 결과 q: {ID100(7)} q: {ID101(3),ID100(7)} q: {ID102(2),ID100(7),ID101(3)} q: {ID102(2),ID100(7),ID101(3),ID103(8)} q: {ID102(2),ID104(3),ID101(3),ID103(8),ID100(7)} q: {ID102(2),ID104(3),ID101(3),ID103(8),ID100(7),ID105(4)} q: {ID106(1),ID104(3),ID102(2),ID103(8),ID100(7),ID105(4),ID101(3)} q: {ID106(1),ID104(3),ID102(2),ID107(3),ID100(7),ID105(4),ID101(3),ID103(8)} queue.remove(): ID106(1) q: {ID102(2),ID104(3),ID101(3),ID107(3),ID100(7),ID105(4),ID103(8)} queue.remove(): ID102(2 q: {ID104(3),ID107(3),ID101(3),ID103(8),ID100(7),ID105(4)} queue.remove(): ID104(3) q: {ID107(3),ID105(4),ID101(3),ID103(8),ID100(7)}queue.remove(): ID107(3) q: {ID101(3),ID105(4),ID100(7),ID103(8)}queue.remove(): ID101(3) q: {ID105(4),ID103(8),ID100(7)}queue.remove(): ID105(4) q: {ID100(7),ID103(8)}queue.remove(): ID100(7) q: {ID103(8)}queue.remove(): ID103(8) q: {}

14.5 사례 연구: 허프만 코드 자료 압축 정보의 손실 없이 본래의 파일 크기보다 작은 파일로 압축 저장소의 사용 및 통신에 유리 영문자의 인코딩 : 고유의 비트 스트링으로 표기 7 비트 사용 (ASCII) 8 비트 parity bit 추가 EBCDIC “TREE” : 32 bit 사용

허프만 코드 문서를 인코딩하는 최적의 알고리즘 이 알고리즘은 가장 자주 나타나는 문자가 가장 짧은 코드를 갖도록 문자에 이진 코드를 부여하는데, 이것은 텍스트 문서를 최소 길이로 인코딩함 탐색 길이의 기대값을 감소시키기 위하여 가장 자주 읽는 노드를 가능한 한 루트에 가깝게 놓는다. 허프만 코드(Huffman code)는 팩스, 모뎀, 컴퓨터 네트워크, 고해상도 텔레비전(high-definition television) 등의 실제적인 응용에 널리 사용되고 있음 prfix constraint 인코딩된 문자의 전위 비트 표기(prefix)가 인코딩된 다른 문자의 전체 비트 표기와 같아서는 안된다. 예 : ‘A’가 ‘1001’이고 ‘M’의 비트 표기가 ‘1001101’이면 이거만 읽어서는 ‘A’의 비트 표기인지 ‘M’의 전위 비트 표기인지 분별할 수 없다.

허프만 코드 생성 과정 문서를 위한 허프만 코드는 문서에 나타나는 서로 다른 문자에 대해 각각 하나의 리프를 갖는 우선순위 큐로부터 생성됨 각각의 문자에 대한 코드는 그 문자에 대한 루트-리프 경로에 의해 결정되는데, 왼쪽 가지는 “0”으로 표시되고, 오른쪽 가지는 “1”로 표시됨 오른쪽-왼쪽-오른쪽으로 가는 루트-리프 경로는 코드 101로 정해짐

허프만 코드의 예

허프만 알고리즘 빈도수 테이블 최소 히프 허프만 트리 허프만 코드

허프만 코드의 생성 허프만 코드 생성 알고리즘 입력 : 문자의 시이퀀스. 출력 : 입력 문자에 대한 비트 코드. 후조건 : 비트 코드가 유일 접두부 특성을 가지고 최적임. 1. 입력 문자에 대한 빈도수 표를 작성. 2. 최소 우선순위 큐에 문자-빈도수 쌍을 적재. 3. 우선순위 큐로부터 허프만 트리 구성. 4. 루트-리프 경로 상의 비트 시이퀀스로 각각의 리프에 있는 문자를 인코드.

인코딩 디코딩 두 문자에 대한 인공적인 문자를 만듬 이진 트리 : 가지는 0과 1로 표기 단말 노드 : 문자를 나타냄 011 01 00 010 인코딩 두 문자에 대한 인공적인 문자를 만듬 인공적인 문자의 빈도수는 두 문자의 빈도수의 합 빈도수가 작은 문자가 루트로부터 가장 멀리 떨어지게 구성 빈도수가 가장 작은 두 문자 Ci와 Cj를 선택하여 인공적인 문자 Cij를 만듬 : fij= fi+fj 디코딩 이진 트리 : 가지는 0과 1로 표기 단말 노드 : 문자를 나타냄 루트로부터 단말 노드로의 순회

Huffman_Encoding(S, f) { /* Input: S(a string of charaters), f(an array of frequency) Output : T(The Huffman tree for S) */ insert all characters into a heap H according to their frequencies; while (H is not empty) { if (H contains only one character X) make X the root of T; else { pick two characters X and Y with lowest frequencies and delete them; replace X and Y with a new character Z whose frequency is the sum of the frequencies of X and Y; insert Z into H; make X and Y children of Z in T; /* Z has no parent yet */ }

예제 텍스트는 A, B, C, D, E, F로 구성되어 있고 각각의 빈도수는 5, 2, 3, 4, 10, 1이다. 4 E A