2013-05-29 14 views
6

Supponendo che sto stampando una stringa, come segue:complessità asintotica di printf

printf("%s", s); 

Cosa possiamo assumere la complessità asintotica di questa funzione è?

E 'O (n), dove n èstrlen (s) - la sua lunghezza? O è in qualche modo O (1), tempo costante. O qualcosa di diverso? Suppongo che tu abbia bisogno di sapere come tende a essere implementato, tuttavia, printf. Qualsiasi comprensione è apprezzata!

(vorrei precisare che sto parlando di C, piuttosto che C++ ma dubito che stanno implementati in modo diverso)

Edit: aggiunto di formattazione a printf()

+1

La sintassi corretta è 'printf ("% s ", stringName);'. –

+0

C'è una buona ragione per quello? Dopotutto, s è già una stringa, quindi perché ha bisogno di essere formattata da printf? – Miguel

+3

@Miguel sì perché _may_ contiene i codici di formattazione e questo produrrà un risultato indefinito/sconosciuto/imprevedibile/probabilmente_massimo. –

risposta

7

E 'la complessità è O (m + n), dove m è la dimensione dell'input e n è la dimensione dell'output.

Se non si passano parametri aggiuntivi come nel caso, la complessità del tempo è O (2 * m) = O (m).

Ma sappiate che il vostro codice può fallire, perché s potrebbe contenere dei codici di formattazione e questo produrrà un risultato indefinito/sconosciuto/imprevedibile/probabilmente_molto sconcio come sottolineato da Adriano.

+0

Quindi stai dicendo che itera su ogni personaggio una volta quando è formattato, quindi una volta quando è in uscita? Non è possibile solo eseguire il dump della memoria su un flusso di output, o è comunque O (m)? – Miguel

+1

Ho sempre pensato che printf restituisse i risultati così come sono, quando ha incontrato un '% d' o un'% s', avrebbe preso l'argomento appropriato e lo avrebbe stampato, quindi la sua complessità sarebbe lineare nel suo primo discussione. –

+0

@SukritKalra ma la stampa di una stringa non è O (1). – effeffe