2015-05-13 15 views
7

compresi la base che se ho una funzione come questa:Come calcolare la complessità dello spazio della funzione?

int sum(int x, int y, int z) { 
    int r = x + y + z; 
    return r; 
} 

richiede 3 unità di spazio per i parametri e 1 per la variabile locale, e questo non cambia mai, quindi questo è O(1).

Ma se ho una funzione come questa:

void add(int a[], int b[], int c[], int n) { 
    for (int i = 0; i < n; ++i) { 
     c[i] = a[i] + b[0] 
    } 
} 

che richiede N unità per a, unità M per b e L unità per c e 1 unità per i e n. Quindi sarà necessario lo spazio di archiviazione N+M+L+1+1.

Quindi quale sarà il grande-O per la complessità spaziale qui? Quello che prende più memoria? I.e. se N richiede un valore più alto di M e L (da molto più alto supponiamo che sia più grande di 10**6) - quindi è sicuro dire che la complessità dello spazio è O(N) o non come facciamo per la complessità del tempo?

Ma se tutti e tre vale a dire a, b, c non sono molto diversi

Ti piace questa funzione

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]; 
     } 
    } 
} 

Allora quale sarà la complessità spaziale? O(N+M+L)? O ancora il più grande?

+0

Quando parliamo di complessità spaziale, tipicamente intendiamo lo spazio ausiliario _ necessario, non lo spazio per gli input stessi. –

+0

La complessità dello spazio include sia lo spazio ausiliario che lo spazio utilizzato dall'input. Destra ? –

+1

@AnkurAnand Tecnicamente, sì. Ma molti usano il termine per indicare semplicemente la complessità dello spazio ausiliario. In particolare ti piacerebbe sapere cose come: "Se passo questo grande set di dati attraverso 100 funzioni, quanta più memoria ho preso, e garbage ho creato?" – btilly

risposta

1

Quando parliamo di complessità dello spazio, non consideriamo lo spazio utilizzato dall'input.

Questo ci consente di parlare di algoritmi che sono spazi costanti, spazio O (log n) ecc. Se iniziamo a contare l'input, allora tutti gli algoritmi saranno almeno uno spazio lineare!

La definizione di complessità dello spazio della macchina di Turing multi-nastro standard non tiene conto dell'output.

L'ingresso è di sola lettura e l'uscita è solo in scrittura e non viene conteggiata per la complessità dello spazio.

Quindi, per rispondere alla tua domanda: cerca ciò che il vostro metodo di memoria alloca, compreso lo spazio di stack per le variabili ricorsione/locali, ecc, e che determinare la complessità dello spazio.

2

La complessità spaziale di un algoritmo o struttura di dati è la quantità massima di spazio utilizzata in qualsiasi momento, ignorando lo spazio utilizzato dall'input all'algoritmo. La complessità spaziale di tutti e tre gli esempi nella domanda è O (1)

Problemi correlati