Click here to load reader
Upload
kochungwook
View
305
Download
8
Embed Size (px)
Citation preview
자료구조 01
Project #6
오탈자 검사
소속 : C1
조장 : 김종진
조원 : 김무경
김정훈
박태원
고충욱
1. 개인별 업무
이 름 업 무
김종진 보고서 작성 및 전반적인 내용 숙지
김무경 프로젝트에 필요한 자료조사
김정훈 알고리즘 조사
박태훈 알고리즘을 기반으로 소스 구현 및 코딩
고충욱 프로젝트에 필요한 자료조사
2. 일정
6 월 12 일 업무분담 및 문제파악
6 월 14 일 조사내용 정리 및 이해, 초안 작성
6 월 19 일 문제점 파악 및 해결방안 모색 및 프로그램 코딩
과제수행일지소 속 C1 조
과제수행기간
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일 목요일
회의주
제사전 검색 알고리즘
회의내
용
사전 검색 알고리즘으로 찾아봤고, 순차 검색과 이진 검색이 있었으나 이는 우리가
구현하려는 트리를 사용한 사전 검색 및 오탈자 검색에는 맞지 않는다고 판단하여 사용하지
않았습니다. 이 외에 어떤 방법이 있을지 토의하고, 찾아보았습니다.
또한 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); // 배열 초기화
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]; // 대각선에 있는 값을 그대로 가져옴
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) { // 동적 메모리 할당 해제
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);
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("-│ ");
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 의 알고리즘만
구현하였음.