(실제 구현은 더욱 단순하다). 다음은 배열의 길이 n과 간격비 K의 서로 다른 셋팅에 대한 셸 정렬의 진행 순서에 대한 예이다. 1. n = 150, K = 3인 경우, Eq. (2)에 따라 m = 5이다. 즉, 셀 정렬은 총 5 단계를 거치며 (m = 5), 121

Similar documents
Data structure: Assignment 3 Seung-Hoon Na December 14, 2018 레드 블랙 트리 (Red-Black Tree) 1 본 절에서는 레드 블랙 트리를 2-3트리 또는 2-3-4트리 대한 동등한 자료구조로 보고, 두 가지 유형의 레

Data structure: Assignment 1 Seung-Hoon Na October 1, Assignment 1 Binary search 주어진 정렬된 입력 파일이 있다고 가정하자. 단, 파일내의 숫자는 공백으로 구 분, file내에 숫자들은

Artificial Intelligence: Assignment 6 Seung-Hoon Na December 15, Sarsa와 Q-learning Windy Gridworld Windy Gridworld의 원문은 다음 Sutton 교재의 연습문제

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

쉽게 배우는 알고리즘 강의노트

chap 5: Trees

C++ Programming

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

2002년 2학기 자료구조

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint - [2009] 02.pptx

쉽게 풀어쓴 C 프로그래밍

2007_2_project4

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

6장정렬알고리즘.key

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

슬라이드 1

PowerPoint 프레젠테이션

chap01_time_complexity.key

Microsoft PowerPoint - C++ 5 .pptx

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

문서의 제목 나눔명조R, 40pt

Lab 3. 실습문제 (Single linked list)_해답.hwp

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션


PowerPoint 프레젠테이션

14장.탐색

Chapter 4. LISTS

쉽게 풀어쓴 C 프로그래밍

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

11장 포인터

Chap 6: Graphs

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - Java7.pptx

K&R2 Reference Manual 번역본

설계란 무엇인가?

PowerPoint Presentation

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

설계란 무엇인가?

C프로-3장c03逞풚

설계란 무엇인가?

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

The C++ Programming Language 5 장포인터, 배열, 구조체 5.9 연습문제 다음의선언문을순서대로작성해보자. 문자에대한포인터, 10개정수의배열, 10개정수의배열의참조자, 문자열의배열에대한포인터, 문자에대한포인터에대한포인터, 상수정수, 상수

쉽게배우는알고리즘 6장. 해시테이블 테이블 Hash Table

Microsoft PowerPoint - chap12-고급기능.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

Frama-C/JESSIS 사용법 소개

C++ Programming

슬라이드 1

Microsoft PowerPoint - additional06.ppt [호환 모드]

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - 05장(함수) [호환 모드]

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

PowerPoint 프레젠테이션

06장.리스트

금오공대 컴퓨터공학전공 강의자료

Computer Programming (2008 Fall)

Ch.8 Procedures and Environments

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

슬라이드 1

Microsoft PowerPoint - additional01.ppt [호환 모드]

adfasdfasfdasfasfadf

untitled

Microsoft PowerPoint - Chapter 1-rev

슬라이드 1

본 강의에 들어가기 전

7장

chap7.key

03_queue

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Microsoft PowerPoint - ch07 - 포인터 pm0415

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

PowerPoint Template

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

금오공대 컴퓨터공학전공 강의자료

설계란 무엇인가?

04 Çмú_±â¼ú±â»ç

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Algorithms

Chapter 4. LISTS

Microsoft PowerPoint - additional08.ppt [호환 모드]

Transcription:

Data structure: Assignment 2 Seung-Hoon Na November 23, 2018 1 Assignment 2 1.1 셸 정렬 (shell sort) 본 절에서는 셸 정렬을 구현하는 것을 목표로 한다. 셸 정렬 (shell sort)는 삽입 정렬(insertion sort)을 개선한 것으로, 한칸씩 원소 교환을 하는 것이 아니라, 여러 칸 간격으로 떨어진 원소들간의 교환을 수행한다. Sequence가 h-sorted (h-정렬) 되었다라고 함은, 전체적으로 정렬된 것은 아니나 h칸 단위로 정렬된 상태를 의미 한다. 다음은 3-정렬된 sequence예를 보여준다1. 2 1 0 4 3 5 8 6 7 9 10 2 --- 4 --- 8 --- 9 1 --- 3 --- 6 --- 10 0 --- 5 --- 7 셸 정렬에서는 40-정렬, 13-정렬, 4-정렬, 1-정렬 순으로 갈 수도 있고, 15-정렬, 7-정렬, 4-정렬, 1-정렬 순으로 갈수도 있으나, 마지막은 항상 1-정렬이어야 한다. 본 절에서는 특정한 간격 순을 따르는 셸 정렬을 구현하고자 한다. 보다 구체 적으로 셸 정렬이, 주어진 간격비 K > 1에 대해, h(m) -정렬, h(m 1) -정렬,, h(0) -정렬 순으로 간다고 하자. 이때, h(0),, h(m) 을 Gap sequences (간격 열) 라고 한다. 본 절의 셸 정렬에서는 h(i) 는 다음을 따른다. h(i) = K i 1 + K i 2 + + K + 1 = Ki 1 K 1 (1) 단, h(0) = 1이고, K = 2 또는 K = 3으로 한정된다 2. 또한, h(m) 이 주어진 배열의 데이터 갯수 n을 초과하지 않아야 한도록, m이 정해져야 한다. 다시 말해, 셸 정렬에서 h-정렬을 수행하는 총 단계수 m은 다음과 같다. n o m = max i h(i) n (2) 1 다시 말해, h-sorted (h-정렬된) sequence란 h interleaved sorted subsequences라고 한다. = 2인 경우의 참고문헌은 다음을 참조하시오. Hibbard, Thomas N. (1963). An Empirical Study of Minimal Storage Sorting. Communications of the ACM. 6 (5): 206 213. doi:10.1145/366552.366557. K = 3인 경우의 참고문헌은 다음을 참조하시오. Pratt, Vaughan Ronald (1979). Shellsort and Sorting Networks (Outstanding Dissertations in the Computer Sciences). Garland. ISBN 0-8240-4406-1. 2K 1

(실제 구현은 더욱 단순하다). 다음은 배열의 길이 n과 간격비 K의 서로 다른 셋팅에 대한 셸 정렬의 진행 순서에 대한 예이다. 1. n = 150, K = 3인 경우, Eq. (2)에 따라 m = 5이다. 즉, 셀 정렬은 총 5 단계를 거치며 (m = 5), 121-정렬, 40-정렬, 12-정렬, 4-정렬, 1-정렬 순으로 진행된다. 2. n = 70, K = 2인 경우, Eq. (2)에 따라 m = 6이다. 즉, 셀 정렬은 총 6단계를 거치며 (m = 6), 63-정렬, 31-정렬, 15-정렬, 7-정렬, 3-정렬, 1-정렬 순으로 진행된다. 1.1.1 셸 정렬 (shell sort) 구현 (c++) 및 테스트 위의 셸 정렬을 위해 삽입 정렬 알고리즘을 일반화하여 주어진 배열 A을 시작위치 start로부터 h칸 단위 정렬된 상태로 만드는 insertionsort를 정의하고 이를 shellsort 내부에서 h를 조정해가며 반복적으로 호출하도록 아래 두 함수를 구현 하시오 (shellsort.h, shellsort.cpp 작성). void insertionsort(int *A, int size, int start, int h); void shellsort(int *A, int size, int K); 단, shellsort의 세 번째 인자 K가 1로 주어지는 경우에는 일반 삽입정렬 (insertion sort)을 수행하면 된다 (즉, m = 1로 1-정렬만 수행하고 리턴). 구현된 shell sort를 랜덤 데이터 및 입력파일을 받아 테스트를 수행하는 테스 트 코드도 함께 제출하시오 (test shellsort.cpp 작성). 간단히, argc로 인자가 있으면 입력 파일로부터 테스트, 그렇지 않으면 랜덤 데이터를 생성하여 테스트를 수행하도록 할 것. 입력파일의 예는 다음과 같다 (input.txt). 2 1 21 4 16 5 22 8 22 6 리눅스 ubuntu 16.04 이상 환경에서 컴파일되도록 하고, 코드가 여러개인 경우 Makefile도 함께 만들어 첨부하라. 다음은 Makefile의 예이다. SRCS = OBJS = TOBJS = shellsort.cpp $(SRCS:.cpp=.o) $(TSRCS:.cpp=.o) LIBS = CC = CFLAGS = g++ test_shellsort: $(OBJS) test_shellsort.o $CC} $(CFLAGS) $(OBJS) test_shellsort.o $(LIBS) -o test_shellsort.cpp.o: $(CC) $(CFLAGS) -c $< 2

1.1.2 셸 정렬 (shell sort) 실행시간 비교 랜덤 배열의 길이 N 이 1000, 10000, 100000, 1000000 으로 증가될때, K가 1, 2, 3인 경우 각각에 대해 shell sort를 수행하는데 걸리는 실제 소요시간을 비교하는 테스트 코드 test shellsort comp.cpp를 작성하시오. 다음은 test shellsort comp.cpp의 컴파일된 프로그램의 출력예이다. N=1000, K=1, elapsed_time: 0.00229502 sec N=1000, K=2, elapsed_time: 0.000361919 sec N=1000, K=3, elapsed_time: 0.000317097 sec N=10000, K=1, elapsed_time: 0.152209 sec N=10000, K=2, elapsed_time: 0.00256705 sec N=10000, K=3, elapsed_time: 0.00183415 sec N=100000, K=1, elapsed_time: 8.40829 sec N=100000, K=2, elapsed_time: 0.030952 sec N=100000, K=3, elapsed_time: 0.0260191 sec N=1000000, K=1, elapsed_time: 842.6 sec N=1000000, K=2, elapsed_time: 0.446693 sec N=1000000, K=3, elapsed_time: 0.368041 sec (N = 1000000, K = 1일때 시간이 지나치게 오래 걸리는 경우는 K = 2, K = 3의 경우 소요시간을 출력하시오.) 여기서, 소요시간을 측정을 위해 gettimeofday를 사용하시오. 사용예는 아래 예제 코드test dtime.cpp에 제시되어 있다. #include #include #include #include #include <iostream> <fstream> <iomanip> <sys/time.h> <unistd.h> using namespace std; double getdtime() struct timeval tv = 0}; double dtime; gettimeofday(&tv, NULL); dtime = tv.tv_sec + (tv.tv_usec / 1000000.0); return dtime; } int main(int argc, char **argv) double oldtime = getdtime(); for(int i=0;i<1000;i++) usleep(1000); } double elapsed_time = getdtime() - oldtime; 3

cerr << "elapsed_time: " << elapsed_time << " sec" << endl; return 1; } 위의 코드의 실행결과는 다음과 같다. elapsed_time: 1.08858 sec 1.1.3 셸 정렬 (shell sort): Sedgewick s method Sedgewick은 셸 정렬의 Gap sequences h(0), h(1),, h(m) 로 다음을 제안하였다. 1 if i = 0 h(i) = (3) 4i + 3 2i 1 + 1 if i 1 위의 Sedgewick의 Gap sequences를 이용한 셸 정렬 shellsort sedgewick을 구현하시오 (shellsort sedgewick.cpp 또는 기존 파일에 포함). void shellsort_sedgewick(int *A, int size); 마찬가지로, 랜덤 배열의 길이 N 이 1000, 10000, 100000, 1000000 으로 증 가될때, K가 3인 경우의 shellsort (Pratt방법)와 위의 shellsort sedgewick (Sedgewick방법)을 수행하는데 걸리는 실제 소요시간을 비교하는 코드 test shellsort sedgewick comp. cpp를 작성하시오. 다음은 test shellsort sedgewick comp.cpp의 컴파일된 프로그램의 출력예 이다. N=1000, Pratt, K=3, elapsed_time: 0.000324011 sec N=1000, Sedgewick, elapsed_time: 6.19888e-05 sec N=10000, Pratt, K=3, elapsed_time: 0.00490284 sec N=10000, Sedgewick, elapsed_time: 0.000871897 sec N=100000, Pratt, K=3, elapsed_time: 0.041738 sec N=100000, Sedgewick, elapsed_time: 0.00625396 sec N=1000000, Pratt, K=3, elapsed_time: 0.378449 sec N=1000000, Sedgewick, elapsed_time: 0.050101 sec 1.1.4 셸 정렬 (shell sort): 계산복잡도 다음 문헌을 참조하여, 셸 정렬을 위한 Gap sequences로 Pratt방법 (Eq. (1)에서 K = 3)과 Sedgewick방법 (Eq. (3)을 사용하여 진행할때의 계산 복잡도를 각각 빅 오로 표시하시오. http://nlp.jbnu.ac.kr/ds2018/shellsort.pdf 1.2 1.2.1 정렬 알고리즘 구현 및 비교: 삽입 정열, 셸 정렬, 병합정렬, 퀵 정렬 비교 (c++) 병합정렬, 퀵 정렬 구현 및 테스트 앞 절의 삽입정렬 및 셸 정렬에 추가로, 아래 병합정렬, 퀵 정렬을 수행하는 함수 mergesort, quicksort를 각각 구현하고, 랜덤 입력에 대해서 각 정렬 알고리즘을 테스트하시오 (mergesort.cpp, quicksort.cpp작성). 4

void mergesort(int *A, int first, int last); void quicksort(int *A, int first, int last); 1.2.2 삽입정렬, 병합정렬, 퀵 정렬 비교 (c++) 랜덤 배열의 길이 N 이 1,000, 10,000, 100,000, 1,000,000, 10,000,000 으로 증가될 때, 셸 정렬의 Pratt방법 (Eq. (1)에서 K = 3)과 Sedgewick방법 (Eq. (3)), 그 리고 병합정렬 및 퀵 정렬을 수행하는데 걸리는 실제 소요시간을 비교하는 테스트 코드 test sort comp.cpp를 작성하시오. (N 이 10,000,000일때의 경우도 적용해 볼 것). 다음은 test sort comp.cpp의 컴파일된 프로그램의 실행예이다. N=1000, Shellsort-Pratt, K=3, elapsed_time: 0.000314951 sec N=1000, Shellsort-Sedgewick, elapsed_time: 0.000309944 sec N=1000, Mergesort, elapsed_time: 0.000330925 sec N=1000, Quicksort, elapsed_time: 0.000251055 sec N=10000, Shellsort-Pratt, K=3, elapsed_time: 0.00479412 sec N=10000, Shellsort-Sedgewick, elapsed_time: 0.00402093 sec N=10000, Mergesort, elapsed_time: 0.00374484 sec N=10000, Quicksort, elapsed_time: 0.00298095 sec N=100000, Shellsort-Pratt, K=3, elapsed_time: 0.0406458 sec N=100000, Shellsort-Sedgewick, elapsed_time: 0.0294759 sec N=100000, Mergesort, elapsed_time: 0.018712 sec N=100000, Quicksort, elapsed_time: 0.0148151 sec N=1000000, Shellsort-Pratt, K=3, elapsed_time: 0.378368 sec N=1000000, Shellsort-Sedgewick, elapsed_time: 0.276325 sec N=1000000, Mergesort, elapsed_time: 0.223466 sec N=1000000, Quicksort, elapsed_time: 0.175819 sec N=10000000, Shellsort-Pratt, K=3, elapsed_time: 5.93688 sec N=10000000, Shellsort-Sedgewick, elapsed_time: 3.49171 sec N=10000000, Mergesort, elapsed_time: 2.56164 sec N=10000000, Quicksort, elapsed_time: 2.01255 sec 1.3 1.3.1 기수 정렬 (radix sort) 셈 정렬 (count sorting) 구현 (c++) 셈 정렬 (counting sort)는 입력 원소 각각이 0부터 k사이에 있는 정수라고 가정한 다. 다음 셈 정렬을 위한 함수 countingsort의 코드를 구현하시오 (countingsort. cpp파일 구현). (단 완성된 countingsort는 안정된 정렬결과를 보장해야 한다) void countingsort(int *A, int size, int k) 랜덤 입력에 대해 구현된 countingsort의 동작을 테스트하는 코드 test countingsort 도 함께 작성하시오. 1.3.2 랜덤 token 생성기 구현 단어 길이 (word length)에 대한 확률 분포 테이블 파일을 입력받아, 최대 W 개 소문자알파벳으로 구성된 단어를 랜덤하게 N 개를 생성하여 출력하는 랜덤 token 5

생성기를 구현하시오. W 와 N 의 설정은 코드에서는 일반화시키도록 하고, 본 절에 는 W = 20, N = 100000으로 고정시킨다. (이때, 생성되는 N 개의 단어는 중복을 허용하는 토큰 (token)단위라고 가정한다.) 입력 단어 길이 확률 분포 테이블 파일은 다음과 같다 (word length stat. txt). - 참고: http://norvig.com/mayzner.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2.998 17.651 20.511 14.787 10.700 8.388 7.939 5.943 4.437 3.076 1.761 0.958 0.518 0.222 0.076 0.020 0.010 0.004 0.001 0.001 0.000 0.000 0.000 랜덤 token 생성기로부터 출력된 결과를 별도 파일로 저장한다 (tokens.txt). 출력된 결과의 예는 다음과 같다.... cssj jxw u fzu kj aen op nn of tq qvfhi fj v cf n rfqxz... 6

1.3.3 MSD 기수 정렬 구현 (c++) 교과서 9장 11절의 내용에 따라 MSD 기수 정렬을 수행하는 프로그램 ratio sort 을 작성하시오 (radio sort.cpp 작성). 상세 요구사항은 다음과 같다. 1. MSD 기수 정렬 구현: 정렬되지 않은 token리스트를 파일로 입력받아, MSD 기수 정렬 을 수행하여 정렬된 token리스트를 최종적으로 출력하는 프로그램 코드 radio sort.cpp를 작성한다. 위에서 구현한 countingsort 를 이용한다. 2. 랜덤 token생성기 결과 파일에 적용: 앞서 랜덤 token 생성기로부터 얻 은 tokens.txt을 파일을 입력받아, MSD 기수 정렬을 수행한 결과 파일 tokens.sorted를 출력하시오. 3. 추가 테스트: N 을 10000, 1000000등 다른 셋팅하에서, 랜덤 token 생성기를 수행하여 얻은 다른 입력파일에 대해서도 작성된 MSD 기수 정렬 프로그램을 테스트하시오. 1.3.4 MSD 기수 교환 정렬 구현 (c++) 교과서 9장 11절의 내용에 따라 MSD 기수 교환 정렬 (Radix exchange sort)를 수행하는 프로그램 ratio exchange sort을 작성하시오 (radio exchange sort. cpp 작성). 상세 요구사항은 다음과 같다. 1. MSD 기수 교환 정렬 구현 2. 랜덤 token생성기 결과 파일에 적용: 마찬가지로, 앞서 랜덤 token 생성기로 부터 얻은 tokens.txt을 입력 파일로 하여, MSD 기수 교환 정렬을 수행한 결과 파일 tokens.exhange sorted를 출력하라. 3. MSD 기수 정렬 및 MSD 기수 교환 정렬 비교: 추가로, 동일 입력 파일 에 대해 MSD 기수 정렬과 MSD 기수 교환 정렬 알고리즘을 수행하였을때 소요시간을 비교하시오. 1.4 이진 탐색 트리 (binary search tree) 본 절에서는 이진탐색트리를 사용하여 주어진 텍스트 파일에 나타나는 각 단어 (word)의 빈도수를 계산하여 저장하는 프로그램을 작성하고자 한다. 각 단어의 빈도수 계산을 위해 datarecord 및 treerecord는 다음과 같이 정 의한다. typedef struct datarecord string Key; int count; } datatype; typedef struct treerecord datatype Data; struct treerecord* LChild; 7

struct treerecord* RChild; } node; typedef node* Nptr; 1.4.1 이진 탐색 트리: 탐색, 삽입,삭제,갱신 구현 (c++) 교과서 10장 7절의 내용을 참조하여, 주어진 key에 대해 이진 탐색 트리 상에서 탐 색, 삽입, 삭제를 수행하는 Search, Insert, Delete, Update함수를 각각 구현하고 테스트 하시오 (BST.ccp, test BST.cpp 작성) Nptr Nptr void void Search(Nptr Insert(Nptr Delete(Nptr Update(Nptr T, const char *key); T, const char *key); &T, const char *key); &T, const char *key); 여기서, Update함수는 이진 탐색 트리 상에서 주어진 key를 갖는 노드가 있으면 해당 노드의 count를 증가시키고, 그렇지 않으면 count를 1로 하는 새로운 노드 를 트리상에서 삽입시키는 함수이다 (앞의 BST.cpp에 추가). 단, Update함수는 Search와 Insert의 외부함수를 이용하여 구현하지 말고, 별 개의 함수로 작성되 어야 한다. (즉, Search한후 해당 key노드가 존재하지 않으면 Insert를 호출하는 방식으로 구현하지 말것) 1.4.2 이진 탐색 트리를 이용한 Word Count 계산 주어진 텍스트 파일로부터 이진탐색트리를 이용하여 모든 단어의 word count를 계 산하고, 중위 순회 (inorder)를 통해 key로 정렬된 word count결과를 출력하는 프로그램 BST word count.cpp를 작성하시오. 구동 테스트를 위해 다음 두 입력 파일 각각에 대해 모든 단어 token이 이 진탐색트리상에서 Update가 되었다면, 중위 순회를 수행하여 해당 결과를 각각 The-Road-Not-Taken.wordcount, Dickens Oliver 1839.wordcount에 저장하 시오. http://nlp.jbnu.ac.kr/ds2018/data/the-road-not-taken.tokens.txt http://nlp.jbnu.ac.kr/ds2018/data/dickens Oliver 1839.tokens.txt 예를 들어, The-Road-Not-Taken.tokens.txt파일내에 있는 모든 단어 token 를 이진탐색트리상에서 Update시킨후에 중위 순회를 통해 최종 Word count출력 하면 다음과 같다.! 1, 10. 3 : 2 ; 2 a 3 about 1 ages 2 all 1 and 9 another 1 as 5 back 1 8

be 2 because 1 bent 1 better 1 black 1 both 2 by 1 claim 1... 1.4.3 Word Count결과로부터 이진탐색 (binary search) 위의 Word count출력결과를 정렬된 순서대로 로딩한 후, 콘솔로부터 사용자 입 력을 받아 해당 입력단어를 key로 하는 이진 탐색 (binary search)을 수행하여 해 당 count를 출력하는 프로그램의 코드 BST word count test.cpp를 작성하시오. (이진탐색트리를 다시 재구성하지 않고, 배열상 이진 탐색을 수행함을 유의하라) 마찬가지로, 구동 테스트를 위해, 앞 문항에서 얻은 두 종류의 Word count출력 결과 파일 The-Road-Not-Taken.wordcount와 Dickens Oliver 1839.tokens. wordcount를 입력 데이터로하여, 이진 탐색의 정상 작동 여부를 확인하여야 한다. 실행 예는 다음과 같다. > BST_word_count_test The-Road-Not-Taken.wordcount Loading is complete <= program's message input> and 9 input> a 3 input> abcdef Not found... 1.4.4 Word Count결과로부터 이진탐색 (binary search): 대용량 데이터로 확장방안 앞 문항에서 Word count출력 결과 (n-gram에 대한 count등)가 대용량인 경우에는 주어진 데이터를 모두 메모리상에 로딩할 수 없다. 이러한 대용량 데이터상에서 사용자 입력에 대한 count를 리턴하기 위해, 로딩 및 탐색을 효율적으로 개선시킬 수 있는 방법은 무엇인지 제안하시오. (제안 방법이 대용량 데이터상에서 효율을 크게 높일 수 있음을 밝히시오.) 1.5 해시 (hash) 본 절에서는 해시를 사용하여 주어진 텍스트 파일에 나타나는 각 단어 (word)의 빈도수를 계산하여 저장하는 프로그램을 작성하고자 한다. 별도 체인 (separate chaining)을 이용한 해시를 사용하고, 이를 위해 다음 자료구조를 정의한다. typedef struct datarecord string Key; 9

int count; } datatype; typedef struct noderecord datatype Data; struct noderecord* next; } node; typedef node* Nptr; 1.5.1 해시 클래스 구현 (c++) 위의 datarecord에 특화된 별도 체인 (separate chaining)기반 해시 자료구조로 다음과 Hash class를 선언한다. 주어진 Hash class의 멤버함수를 모두 구현하시오 (Hash.h, Hash.cpp). 구동 테스트를 위한 코드도 함께 작성하시오. class Hash public: int size; Nptr *table; public: void Create(int tablesize); int Insert(const char *key); Nptr Search(const char *key); void Update(const char *key); void Delete(const char *key); void Save(const char *filename); void Open(const char *filename); void Rehash(int newtablesize); } 각 함수에 대한 설명은 다음과 같다. Create: tablesize로 하는 해시 테이블을 생성한다. Insert: 주어진 key를 갖는 노드가 없으면 해당 key를 취하고 count를 1로 하는 새로운 노드를 해시에 삽입시킨다. Search: 주어진 key를 갖는 노드가 없으면 NULL, 있다면 노드의 포인터를 리턴한다. Update: 주어진 key를 갖는 노드가 있으면 해당 노드의 count를 증가시키 고, 그렇지 않으면 주어진 key로 count를 1로 하는 새로운 노드를 해시에 삽입시킨다. 이진 탐색트리의 Update와 마찬가지로, Search한후 해당 key 노드가 존재하지 않으면 Insert를 호출하는 방식이 아닌, Update함수에 내 에서 외부 함수 호출없이 필요한 내용이 모두 포함되도록 할 것. Save: 해시테이블을 binary또는 text파일로 저장한다. 차후 빠르게 loading 할수 있도록 파일 포맷을 잘 설계해야 한다. 10

Open: 저장한 해시테이블 파일을 읽어들여 메모리상으로 loading한다. Rehash: newtablesize로 재 해시를 수행한다. 문자열에 대한 해시함수로 본인만의 문자열 폴딩 방식을 이용하거나, 그렇지 않으면 다음의 코드를 사용하라. int strhashfunc(const char *key) char *str = (char*)key; unsigned int hashval = 0; for (hashval = 0; *str; str++) hashval = *str + (hashval << 5) - hashval; return hashval; } 1.5.2 해시를 이용한 Word count계산 및 사용자 테스트 해시를 이용하여 주어진 텍스트 파일에 있는 각 단어의 word count를 계산하고, 계산된 결과를 해쉬 파일로 저장하는 Hash word count.cpp를 작성하시오. 마찬가지로, 또한 구동 테스트를 위해 다음 두 가지 입력 파일에 대해 테스트 를 수행하고, 각 파일내 모든 단어 token이 Update되어 각 단어의 word count가 해시내에서 계산된 경우, 해시테이블의 내용을 각각 The-Road-Not-Taken.hash, Dickens Oliver 1839.hash에 저장하시오.. http://nlp.jbnu.ac.kr/ds2018/data/the-road-not-taken.tokens.txt http://nlp.jbnu.ac.kr/ds2018/data/dickens Oliver 1839.tokens.txt 추가로, 저장된 해시 파일 The-Road-Not-Taken.hash, Dickens Oliver 1839. hash를 로딩하여 해시를 메모리에 올린후, 사용자로부터 단어를 입력단어 Search 를 수행하여 해당 단어가 있으면 count를 그러지 않으면 Not found를 출력하는 코드 Hash word count test.cpp를 작성하시오. 1.5.3 해시와 이진탐색트리 효율 비교 Dickens Oliver 1839.tokens.txt상에서 N 개의 랜덤 key에 대ㅎ Search를 호 출할 때 해시와 이진탐색트리상에서의 소요시간을 비교하시오 (N = 100000이상). 1.6 힙 정렬 (Heap sort) 주어진 데이터에 대한 힙 정렬을 수행하고자 한다. 1.6.1 하향식 힙 구성 교과서 11장 4절의 내용을 참조하여 힙 정렬을 위해 주어진 배열에 대해 하향식 힙 구성을 수행하는 다음 build heap함수를 구현하시오. 또한, 랜덤 입력 배열에 대해 build heap동작을 테스트하시오. void build_heap(int *A, int size); 11

1.6.2 힙 정렬 힙 정렬은 구성된 힙으로부터 가장 우선순위가 큰 루트노드를 계속 삭제하면서 이 루어진다. 힙 삭제과정은 제일 마지막 요소를 루트노드에 덮어씌운후, 루트로부터 시작해 힙 모습을 되찾는 Down heap을 통해 이루어진다. 다음 힙 삭제함수 remove heap를 구현하고, 이를 이용하여 힙 정렬을 수행하는 코드 heap sort.cpp를 작성하시오. int remove_heap(int *A, int size); 추가로, 랜덤 입력 데이터에 대해 구현된 힙 정렬 프로그램을 테스트하시오. 1.7 제출 내용 및 평가 방식 코드는 c++ (특별한 요구사항이 있을 경우 java)로 작성하도록 하고, c++프로 그램의 경우 구동os환경은 ubuntu 16.04 LTS 이상을 원칙으로 한다. 본 과제 결과물로 필수적으로 제출해야 내용들은 다음과 같다. 코드 전체 테스트 결과: 각 내용별 테스트 코드 및 해당 로그 파일 결과보고서: 구현 방법 및 실행 결과를 요약한 보고서 본 과제의 평가항목 및 배점은 다음과 같다. 각 세부내용의 구현 정확성 및 완결성 (80점) 코드의 Readability 및 쳬계성 (10점) 결과 보고서의 구체성 및 완결성 (10점) 12