문자열에서 문장의 수를 찾기 위해 작성한이 코드의 공간과 시간 복잡성을 찾는 데 어려움이 있습니다. 이 코드의 시간과 공간의 복잡성을 어떻게 알 수 있습니까?
/**
This program finds palindromes in a string.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int checkPalin(char *str, int len)
{
int result = 0, loop;
for (loop = 0; loop < len/2; loop++)
{
if (*(str+loop) == *(str+((len - 1) - loop)))
result = 1;
else {
result = 0;
break;
}
}
return result;
}
int main()
{
char *string = "baaab4";
char *a, *palin;
int len = strlen(string), index = 0, fwd=0, count=0, LEN;
LEN = len;
while(fwd < (LEN-1))
{
a = string+fwd;
palin = (char*)malloc((len+1)*sizeof(char));
while(index<len)
{
sprintf(palin+index, "%c",*a);
index++;
a++;
if (index > 1) {
*(palin+index) = '\0';
count+=checkPalin(palin, index);
}
}
free(palin);
index = 0;
fwd++;
len--;
}
printf("Palindromes: %d\n", count);
return 0;
}
나는 그것에게 기회를주고, 내가 무슨 생각이 :
을 주에 우리는 두 동안 루프를 가지고있다. 바깥 쪽은 문자열의 전체 길이 -1에 걸쳐 있습니다. 이제 혼란이 있습니다. inner while 루프가 먼저 전체 길이에 걸쳐 실행되고, 그 다음에 n-1, then-2 등이 실행됩니다. 그렇다면 우리의 시간 복잡성은
O(n(n-1)) = O(n^2-n) = O(n^2)
일까요? 그리고 공간의 복잡성에 대해 처음에는 문자열 길이 +1, 그 다음 (길이 +1) -1, (길이 +1) -2 등의 공간을 할당합니다. 어떻게 공간 복잡성을 찾을 수 있습니까? checkPalin 함수의 경우
O(n/2)
입니다.
나는 인터뷰를 준비 중이며이 개념을 이해하고자합니다.
감사합니다.
아, 그리워. 내가 틀렸다면 나를 정정하십시오, 그래서 시간 복잡성은 다음과 같이 작성되어야합니다 : O (n-1 (n/2)) = O (1/2 (n^3-n^2)) = O (n^3). 그게 아주 나쁜 !!! – infinitloop
@rashid - 귀하의 수정 된 분석이 정확하다고 생각합니다. 그것이 나쁘거나 나쁜지간에, 나는 모른다. 효율적으로 처리하는 것은 어려운 문제입니다. 알고리즘의 속도를 늦추지 않고도 공간 복잡성을 O (1)로 줄일 수 있습니다. 하위 문자열을 스크래치 영역에 복사하지 않고도 (왜 더 많은 부기가있는) 방금 체크 인 할 수없는 이유는 모르겠다. –