자료구조 Project6

524 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
524
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

자료구조 Project6

  1. 1. 자료구조 01Project #6 오탈자 검사 소속 : C1 조장 : 김종진 조원 : 김무경
  2. 2. 김정훈 박태원 고충욱1. 개인별 업무이 름 업 무김종진 보고서 작성 및 전반적인 내용 숙지김무경 프로젝트에 필요한 자료조사김정훈 알고리즘 조사박태훈 알고리즘을 기반으로 소스 구현 및 코딩고충욱 프로젝트에 필요한 자료조사
  3. 3. 2. 일정 6 월 12 일 업무분담 및 문제파악 6 월 14 일 조사내용 정리 및 이해, 초안 작성 6 월 19 일 문제점 파악 및 해결방안 모색 및 프로그램 코딩 과제수행일지소 속 C1 조과제수행 14일 16 시간 기간 주 제연구제목 오탈자 검사 검색했을 때 단어를 찾아주는 검색 알고리즘, 오탈자 검사를 하여 비슷한 단어를연구배경 찾아주는 알고리즘을 만듬. 참 고 자 료 참고 C 로 쓴 자료구조론 (저자 : 이석호 ) - 교보문고 서적 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 URL /OyMV+(Full+of+Aroma+%26+Bouquet : 작동원리설명 http://blog.naver.com/skout123?Redirect=Log&logNo=50136214727 : 순차 검색
  4. 4. 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일 화요일회의주제 프로그램 초안 확인, 개량안 제시
  5. 5. #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;
  6. 6. 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); // 초기화}}
  7. 7. 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;}
  8. 8. 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("nn");printf(" Distance : %d", matrix[tLen-1][sLen-1]);printf("nn");}void freeMatrix(int **matrix, int tLen) { // 동적 메모리 할당 해제int i;
  9. 9. 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 입력
  10. 10. 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 기본 초기화
  11. 11. 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");}
  12. 12. printf("nn"); printf(" Distance : %d", matrix[tLen-1][sLen-1]); printf("nn"); } void freeMatrix(int **matrix, int tLen) { // 동적 메모리 할당 해제 int i; for(i = 0; i < tLen; i++) free(matrix[i]); free(matrix); } edit distance 를 비교할 두 단어를 입력받아 이차원 배열의 행렬에 대응시킨다. ↓ 각 행렬에 위치하는 문자를 비교한다. ↓ ↓알고리즘 비교한 문자가 서로 같을 경우, 해당하는 비교한 문자가 서로 다를 경우, 해당하는 개요 행렬의 왼쪽, 위, 왼쪽 위 대각선에 위치한 행렬의 왼쪽, 위, 왼쪽 위 대각선에 위치한 거리값 중 제일 작은 수에 1 을 더한 수가 거리값 중 제일 작은 수를 해당 행렬에 해당 행렬에 들어가게 된다. 입력한다. ↓ 배열이 가득 찰 때까지 위의 두 과정을 반복한다. 최종 사전 파일을 불러와서 자료구조화 시키지 못하였으며 Edit distance 의 알고리즘만 반성 구현하였음.

×