Zrozumiałem podstawową, że jeśli mam funkcję tak:Jak obliczyć złożoność przestrzeni funkcji?
int sum(int x, int y, int z) {
int r = x + y + z;
return r;
}
wymaga 3 jednostki przestrzeni parametrów i 1 dla zmiennej lokalnej, a to nigdy się nie zmienia, więc jest to O(1)
.
Ale co, jeśli mam funkcji takiego:
void add(int a[], int b[], int c[], int n) {
for (int i = 0; i < n; ++i) {
c[i] = a[i] + b[0]
}
}
który wymaga jednostki N dla a
, jednostek M dla b
i L jednostek dla c
i 1 jednostka dla i
i n
. Więc będzie potrzebować N+M+L+1+1
ilość pamięci.
Co będzie wielka szansa na złożoność przestrzeni? Ten, który zajmuje wyższą pamięć? tj. jeśli N ma wyższą macierzyństwo niż M i L (z dużo wyższych średnich przypuszczamy, że są większe niż 10**6
) - czy można bezpiecznie powiedzieć, że złożoność przestrzeni to O(N)
, czy też nie tak, jak w przypadku złożoności czasowej?
Ale jeśli wszystkie trzy tj a, b, c nie są bardzo różni
Podobnie jak tej funkcji
void multiply(int a[], int b[], int c[][], int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
c[i] = a[i] + b[j];
}
}
}
Więc co będzie złożoność przestrzeń? O(N+M+L)
? A może największy?
Kiedy mówimy o złożoności przestrzeni, zazwyczaj mamy na myśli zajmującą przestrzeń - niepotrzebną przestrzeń dla samych nakładów. –
Złożoność przestrzeni obejmuje zarówno przestrzeń pomocniczą, jak i przestrzeń wykorzystywaną przez dane wejściowe. Dobrze ? –
@AnkurAnand Technicznie, tak. Ale wielu używa tego terminu do oznaczania złożoności przestrzeni pomocniczej. W szczególności chciałbyś wiedzieć takie rzeczy, jak: "Jeśli przekażę ten duży zestaw danych przez 100 funkcji, ile jeszcze pamięci wziąłem, a ja ja stworzyłem śmieci?" – btilly