10

Click here to load reader

자료구조 Project6

Embed Size (px)

Citation preview

Page 1: 자료구조 Project6

자료구조 01

Project #6

오탈자 검사

소속 : C1

조장 : 김종진

조원 : 김무경

김정훈

박태원

고충욱

1. 개인별 업무

Page 2: 자료구조 Project6

이 름 업 무

김종진 보고서 작성 및 전반적인 내용 숙지

김무경 프로젝트에 필요한 자료조사

김정훈 알고리즘 조사

박태훈 알고리즘을 기반으로 소스 구현 및 코딩

고충욱 프로젝트에 필요한 자료조사

2. 일정

6 월 12 일 업무분담 및 문제파악

6 월 14 일 조사내용 정리 및 이해, 초안 작성

6 월 19 일 문제점 파악 및 해결방안 모색 및 프로그램 코딩

과제수행일지소 속 C1 조

Page 3: 자료구조 Project6

과제수행기간

14일 16 시간

주 제연구제

목오탈자 검사

연구배

검색했을 때 단어를 찾아주는 검색 알고리즘, 오탈자 검사를 하여 비슷한 단어를 찾아주는

알고리즘을 만듬.

참 고 자 료 참고

서적C 로 쓴 자료구조론 (저자 : 이석호 ) - 교보문고

참고

URL

http://www.clear.rice.edu/comp130/12spring/editdist/ : 알고리즘 설명

http://jzcafe.blogspot.kr/2012/05/levenshtein-distance.html?

utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/

OyMV+(Full+of+Aroma+%26+Bouquet : 작동원리설명

http://blog.naver.com/skout123?Redirect=Log&logNo=50136214727 : 순차 검색

http://blog.naver.com/skout123?Redirect=Log&logNo=50136236029 : 이진 검색

http://bllackperl.tistory.com/70 : 해시 테이블

과제의 수행

첫째날 2012년 6월 12일 화요일

회의

주제역할분담 및 토의

회의

내용

조장 : 김종진

자료 조사 : 김무경, 고충욱

프로그래밍 : 김정훈, 김정훈

역할분담, 일정 정함.

사전을 자료구조화 시키는것, 오탈자 검사를 어떻게 할 것인지에 대해 토의.

edit distance 및 사전을 자료구조화 시키는 방법에 대해 조사해오기로 함.

반성

사전에 미리 조사해오지 못한 탓에 edit distance 에 대한 지식이 부족했고, 문제에 대한

파악이 늦었습니다.

사전을 자료구조화 시키는 방법과 오탈자를 검사하는 방법 등을 알아오기로 하였습니다.둘째날 2012년 6월 14일 목요일

회의주

제사전 검색 알고리즘

회의내

사전 검색 알고리즘으로 찾아봤고, 순차 검색과 이진 검색이 있었으나 이는 우리가

구현하려는 트리를 사용한 사전 검색 및 오탈자 검색에는 맞지 않는다고 판단하여 사용하지

Page 4: 자료구조 Project6

않았습니다. 이 외에 어떤 방법이 있을지 토의하고, 찾아보았습니다.

또한 edit distance 에 대해 찾아보았으며 어떤 것인지 파악하고, 맞는 알고리즘을

찾아보기로 하였습니다.

반성

오탈자를 검사할 때 단어를 하나하나 찾아보는게 비효율적이라는건 알고 있었으나 그 외에 틀린부분을 건너 뛰거나 하는 방법으로 찾을 경우 다른 단어를 찾았을 때보다 eidt distance가 작은 더 근접한 단어가 나올 경우도 있어서 이 모든 것을 대처해서 알고리즘을 짜기에는 힘들었습니다.

셋째날 2012년 6월 19일 화요일

회의주

제프로그램 초안 확인, 개량안 제시

프로그

램 초안

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void initMatrix(int ***matrix, int sLen, int tLen); // 이차원 동적 메모리 할당

void LD(int **matrix, char *s, char *t); // LD 알고리즘 계산

int minimum(int insert, int replace, int del); // 중간값을 리턴

void printMatrix(int **matrix, char *s, char *t); // 결과 출력

void freeMatrix(int **matrix, int tLen); // 동적 메모리 할당 해제

int main(void) {

char s[20], t[20];

int sLen, tLen, count, i;

int **matrix = NULL;

printf("반복 횟수를 입력하세요 : "); // 계산 횟수

scanf("%d", &count);

getchar();

printf("\n");

for(i = 0; i < count; i++) {

printf("첫번째 문자열을 입력 하세요 : "); // 비교문자열 s 입력

gets(s);

printf("두번째 문자열을 입력 하세요 : "); // 비교문자열 t 입력

gets(t);

printf("\n");

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

initMatrix(&matrix, sLen, tLen); // 배열 초기화

Page 5: 자료구조 Project6

LD(matrix, s, t); // 배열 계산

printMatrix(matrix, s, t); // 배열 출력

freeMatrix(matrix, tLen); // 메모리 초기화

}

return 0;

}

void initMatrix(int ***matrix, int sLen, int tLen) { // 이차원 동적 메모리 할당

int i;

*matrix = (int**)malloc(sizeof(int*) * tLen);

if(*matrix == NULL) {

printf("메모리 할당 실패\n 프로그램을 종료 합니다.\n");

exit(-1);

}

memset(*matrix, 0, sizeof(int*) * tLen); // 초기화

for(i = 0; i < tLen; i++) {

(*matrix)[i] = (int*)malloc(sizeof(int) * sLen);

if(*matrix == NULL) {

printf("메모리 할당 실패\n 프로그램을 종료 합니다.\n");

exit(-1);

}

memset((*matrix)[i], 0, sizeof(int) * sLen); // 초기화

}

}

void LD(int **matrix, char *s, char *t) {

int sLen, tLen;

int i, j;

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

for(i = 0; i < tLen; i++) matrix[i][0] = i; // col 기본 초기화

for(i = 0; i < sLen; i++) matrix[0][i] = i; // row 기본 초기화

for(j = 1; j < sLen; j++) {

for(i = 1; i < tLen; i++) {

if(s[j-1] == t[i-1]) // s, t 의 문자가 같으면

matrix[i][j] = matrix[i-1][j-1]; // 대각선에 있는 값을 그대로 가져옴

Page 6: 자료구조 Project6

else // 그렇지 않으면

matrix[i][j] = minimum(matrix[i-1][j]+1, matrix[i-1][j-1]+2, matrix[i][j-1]+1);

// 삭제, 대치, 삽입의 값중에 중간값 대입

}

}

}

int minimum(int insert, int replace, int del) { // 중간값을 리턴

int min;

min = insert;

if(replace <= min) min = replace;

if(del <= min) min = del;

return min;

}

void printMatrix(int **matrix, char *s, char *t) { // 결과물 출력

int sLen, tLen;

int i, j;

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

printf(" - ");

for(i = 0; i < sLen; i++)

printf("%c ", s[i]);

printf("\n ┌");

for(i = 0; i < sLen; i++) printf("──");

printf("\n");

printf("-│ ");

for(i = 0; i < tLen; i++) {

if(i > 0) printf("%c│ ", t[i-1]);

for(j = 0; j < sLen; j++)

printf("%2d ", matrix[i][j]);

printf("\n");

}

printf("\n\n");

printf(" Distance : %d", matrix[tLen-1][sLen-1]);

printf("\n\n");

}

void freeMatrix(int **matrix, int tLen) { // 동적 메모리 할당 해제

Page 7: 자료구조 Project6

int i;

for(i = 0; i < tLen; i++)

free(matrix[i]);

free(matrix);

}

회의내

eidt distance 외에도 Levenshtein Distance 라는 것을 찾아 이를 프로그램에 적용해

보려고 하였습니다.

문제점

● 사전 파일을 불러와서 자료구조화 시키지 못함

● 과제로 출제된 기능을 실행하지 못함(두 단어를 입력받아 얼마만큼의 차이가 발생하는지 출력)

결과 발표

프로그

램 소스

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

void initMatrix(int ***matrix, int sLen, int tLen); // 이차원 동적 메모리 할당

void LD(int **matrix, char *s, char *t); // LD 알고리즘 계산

int minimum(int insert, int replace, int del); // 중간값을 리턴

void printMatrix(int **matrix, char *s, char *t); // 결과 출력

void freeMatrix(int **matrix, int tLen); // 동적 메모리 할당 해제

int main(void) {

char s[20], t[20];

int sLen, tLen, count, i;

int **matrix = NULL;

printf("반복 횟수를 입력하세요 : "); // 계산 횟수

scanf("%d", &count);

getchar();

printf("\n");

for(i = 0; i < count; i++) {

printf("첫번째 문자열을 입력 하세요 : "); // 비교문자열 s 입력

gets(s);

printf("두번째 문자열을 입력 하세요 : "); // 비교문자열 t 입력

gets(t);

printf("\n");

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

initMatrix(&matrix, sLen, tLen); // 배열 초기화

LD(matrix, s, t); // 배열 계산

printMatrix(matrix, s, t); // 배열 출력

freeMatrix(matrix, tLen); // 메모리 초기화

}

return 0;

}

void initMatrix(int ***matrix, int sLen, int tLen) { // 이차원 동적 메모리 할당

int i;

*matrix = (int**)malloc(sizeof(int*) * tLen);

Page 8: 자료구조 Project6

if(*matrix == NULL) {

printf("메모리 할당 실패\n 프로그램을 종료 합니다.\n");

exit(-1);

}

memset(*matrix, 0, sizeof(int*) * tLen); // 초기화

for(i = 0; i < tLen; i++) {

(*matrix)[i] = (int*)malloc(sizeof(int) * sLen);

if(*matrix == NULL) {

printf("메모리 할당 실패\n 프로그램을 종료 합니다.\n");

exit(-1);

}

memset((*matrix)[i], 0, sizeof(int) * sLen); // 초기화

}

}

void LD(int **matrix, char *s, char *t) {

int sLen, tLen;

int i, j;

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

for(i = 0; i < tLen; i++) matrix[i][0] = i; // col 기본 초기화

for(i = 0; i < sLen; i++) matrix[0][i] = i; // row 기본 초기화

for(j = 1; j < sLen; j++) {

for(i = 1; i < tLen; i++) {

if(s[j-1] == t[i-1]) // s, t 의 문자가 같으면

matrix[i][j] = matrix[i-1][j-1]; // 대각선에 있는 값을 그대로 가져옴

else // 그렇지 않으면

matrix[i][j] = minimum(matrix[i-1][j]+1, matrix[i-1][j-1]+2, matrix[i][j-1]+1);

// 삭제, 대치, 삽입의 값중에 중간값 대입

}

}

}

int minimum(int insert, int replace, int del) { // 중간값을 리턴

int min;

min = insert;

if(replace <= min) min = replace;

if(del <= min) min = del;

return min;

}

void printMatrix(int **matrix, char *s, char *t) { // 결과물 출력

int sLen, tLen;

int i, j;

sLen = strlen(s) + 1;

tLen = strlen(t) + 1;

printf(" - ");

for(i = 0; i < sLen; i++)

printf("%c ", s[i]);

printf("\n ┌");

for(i = 0; i < sLen; i++) printf("──");

printf("\n");

printf("-│ ");

Page 9: 자료구조 Project6

for(i = 0; i < tLen; i++) {

if(i > 0) printf("%c│ ", t[i-1]);

for(j = 0; j < sLen; j++)

printf("%2d ", matrix[i][j]);

printf("\n");

}

printf("\n\n");

printf(" Distance : %d", matrix[tLen-1][sLen-1]);

printf("\n\n");

}

void freeMatrix(int **matrix, int tLen) { // 동적 메모리 할당 해제

int i;

for(i = 0; i < tLen; i++)

free(matrix[i]);

free(matrix);

}

알고리

즘 개요

edit distance 를 비교할 두 단어를 입력받아 이차원 배열의 행렬에 대응시킨다.↓

각 행렬에 위치하는 문자를 비교한다. ↓ ↓

비교한 문자가 서로 같을 경우, 해당하는 행렬의 왼쪽, 위, 왼쪽 위 대각선에 위치한

거리값 중 제일 작은 수에 1 을 더한 수가 해당 행렬에 들어가게 된다.

비교한 문자가 서로 다를 경우, 해당하는 행렬의 왼쪽, 위, 왼쪽 위 대각선에 위치한

거리값 중 제일 작은 수를 해당 행렬에 입력한다.

배열이 가득 찰 때까지 위의 두 과정을 반복한다.최종

반성

사전 파일을 불러와서 자료구조화 시키지 못하였으며 Edit distance 의 알고리즘만

구현하였음.