게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[본삭금] 재가 짠 알고리즘의 시간복잡도 계산을 못하겠습니다...(나눔_
게시물ID : programmer_13809짧은주소 복사하기
작성자 : 가시돋은나무
추천 : 2
조회수 : 610회
댓글수 : 17개
등록시간 : 2015/10/12 03:31:14
옵션
  • 창작글
  • 베스트금지
  • 본인삭제금지
안녕하세요.

프로그래머 학부생입니다

이번에 문자열소팅에 관한 과재가 나와서 sorting알고리즘을 짰는데요.(divide and qonquer)

되는데로 수정해가며,,, 구글링(...ㅠㅠ)....해가며 디버깅(으아아악)해가며 어찌저찌 짰는데

문제는 재가 알고리즘 개강 초반에 시간복잡도 계산하는 부분에서 졸음을 이기지못하여(오열...)

알고리즘 강의를 배웠다면 개나 소나(전 아직 사람이 아니에요 ㅠㅠ)한다는 time complexity를 계산을 못한다는겁니다...(개멍청, 말미잘)

그래서 오유 프로그래머 게시판에 상주하시고 계신 프로그래머 형님들꼐 댓글로 커피를 나눔함(이라고 쓰고 뇌물이라고 읽어요..)과 동시에

질문합니다

재가 짠 알고리즘의 시간복잡도는 B(O) = ? 인가요....(쭈글쭈글)


----------------------------------------------------------------------

void StrInfo::Merge(int s, int m, int e, string &str)
{
int cntLeft = m - s + 1;
int cntRight = e - m;
char* pLeft = new char[cntLeft + 1];
char* pRight = new char[cntRight + 1];
int x = 0, y = 0;

for (int i = s; i < m + 1; i++)
{
pLeft[x] = str[i];
x++;
}

for (int i = m + 1; i <= e; i++)
{
pRight[y] = str[i];
y++;
}

x = 0, y = 0; //x, y 초기화

for (int i = s; i <= e; i++)
{
if (x < cntLeft && y < cntRight)
{
if (pLeft[x] - '0' > pRight[y] - '0') //문자를 int형으로 바꿔서 비교한다.
{
str[i] = pRight[y];
y++;
}
else {
str[i] = pLeft[x];
x++;
}
}

else if (x == cntLeft)
{
str[i] = pRight[y];
y++;
}

else if (y == cntRight)
{
str[i] = pLeft[x];
x++;
}
}
}

void StrInfo::M_Sort(int s, int e, string &str)
{
if (s == e)
return;

int m = (s + e) / 2;

M_Sort(s, m, str);
M_Sort(m + 1, e, str);
Merge(s, m, e, str);
}

bool StrInfo::Str_Check(int s, int m, int e)
{
string first_1 = ""; //문자열 a1
string first_2 = ""; //문자열 a2
string second_1 = ""; //문자열 b1
string second_2 = ""; //문자열 b2

for (int i = s; i < m + 1; i++)
{
first_1 = first_1 + first[i];
second_1 = second_1 + second[i];
}

for (int i = m + 1; i < e + 1; i++)
{
first_2 = first_2 + first[i];
second_2 = second_2 + second[i];
}

//문자열을 정렬(알파벳순으로 오름차순)
M_Sort(0, (e - s) / 2, first_1);
M_Sort(0, (e - s) / 2, first_2);
M_Sort(0, (e - s) / 2, second_1);
M_Sort(0, (e - s) / 2, second_2);

if ((first_1 == second_1) && (first_2 == second_2)) //a1 == b1 & a2 == b2
return true;

else if ((first_1 == second_2) && (first_2 == second_1)) //a1 == b2 & a2 == b1
return true;

else
return false;
}

void StrInfo::DivideQonquer(int s, int e)
{
if (e - s + 1 == 2) //비교하려는 문자열의 길이가 2일때까지 Divide and Conquer
{
return;
}

int m = (s + e) / 2;

if (!Str_Check(s, m, e)) //성립하는 조건이 없으면
{
result = false;
return;
}

DivideQonquer(s, m);
DivideQonquer(m + 1, e);
}
꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호