我很難找到這個代碼的空間和時間複雜度,我寫了一個字符串找到迴文數。我如何找到這段代碼的時間和空間複雜性?
/**
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;
}
我給它一個鏡頭,這就是我想:
主,我們有兩個while循環。外部字符串在字符串的整個長度-1上運行。現在這裏是混淆,內部while循環首先遍歷整個長度,然後是n-1,然後是n-2等,用於外部while循環的每次迭代。那麼這意味着我們的時間複雜度將是O(n(n-1)) = O(n^2-n) = O(n^2)
? 而對於空間複雜性,最初我給字符串長度+1分配空間,然後(長度+ 1)-1,(長度+1)-2等,所以我們如何從中找到空間複雜度? 對於checkPalin函數,它的O(n/2)
。
我正在準備面試,並想了解這個概念。
謝謝
啊,我錯過了。如果我錯了,糾正我,所以時間複雜性應該寫成這樣:O(n(n-1(n/2)))= O(1/2(n^3-n^2))= O (N^3)。這很糟糕! – infinitloop 2011-05-02 16:32:17
@rashid - 我認爲你修改後的分析是正確的。無論是不好還是不好,我都不知道。這是一個難以有效執行的難題。您可能可以將空間複雜度降低到O(1),而不會減慢算法速度;我不明白爲什麼你不能(只需要更多的簿記)只需檢查就位,而不要將子字符串複製到劃痕區域。 – 2011-05-02 16:45:00