Nell'analisi della complessità perché ++ è considerato come 2 operazioni?
-
22-07-2019 - |
Domanda
Nella mia classe di Informatica II, il professore considera ++, -, * =, ecc. come 2 operazioni. Tuttavia, a livello di Assemblea non si tratta in realtà di due operazioni. Qualcuno può spiegare o è solo per motivi di semplicità?
Soluzione
Considererei in realtà 3 operazioni: lettura, incremento (o qualunque altra cosa), scrittura. Ciò presuppone che stia leggendo da una sorta di memoria condivisa in una sorta di memoria locale (ad es. Registro o stack), operando sulla memoria locale, quindi riscrivendo.
Quante operazioni è a livello di assembly dipenderà da ciò che si sta incrementando, dalla piattaforma, dall'hardware ecc.
Altri suggerimenti
Perché ++ (ex: b ++) è una semplificazione di
b = b + 1
Ci sono due operazioni lì, l'aggiunta (b + 1) e quindi l'assegnazione del valore dell'aggiunta alla variabile originale.
Perché preoccuparsi quando si esegue l'analisi della complessità? È solo O (1) :-)
EDIT: per favore fatemi sapere perché quando lo votate verso il basso. Poiché la domanda è taggata complessità , presumo che la grande nozione O sia la più importante, piuttosto che le costanti effettive. Inoltre, come già menzionato in altre risposte, quante operazioni dipendono da molti fattori: il modo in cui conti operazioni, piattaforma, compilatore, ecc.
Lancerò alcune ipotesi.
- Il tuo professore si riferisce a lingue interpretate?
- ++ i è diverso da i ++ forse si riferisce a quello?
-
Forse la sua lingua preferita di assembly ha bisogno della variabile di memoria intermedia?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
Non è un'aggiunta più un setter?
Simile a i + = 1?
Probabilmente il prof si sta semplicemente riferendo a dover prendere il valore, aggiungere 1 ad esso e quindi assegnarlo di nuovo alla variabile.
A livello di assembly tutto viene fatto nei registri, quindi con una variabile in A
ADD AX,1
Tuttavia, nelle lingue compilate tutto deve essere archiviato in modo che i ++ diventi (in pseudo assembly)
MOV AX,i
ADD AX, 1
MOV i, AX
Che sono tre operazioni ... A meno che non abbia dimenticato completamente la mia architettura di base ...
Mi hai ricordato un Kinda " La giuria non è fuori " problema che ho sentito molto tempo fa.
" Preincrement è più veloce del postincrement "
Ho appena fatto una rapida ricerca su Google.
- Molte persone continuano a ritenerlo vero.
- Altri affermano che i compilatori sono così ottimizzati, che il codice comparativo di alto livello non può essere confrontato.
- Tuttavia altre persone sostengono che non c'è differenza .
Secondo me dovrebbe essere più di 2 poiché ha due significati a seconda del contesto e devo sempre ricordarmeli quando lo vedo.
a = b ++
è uguale a a = b; b = b + 1
e
a = ++ b
è uguale a b = b + 1; a = b
Questa è una certa confusione per mandare fuori dalla scogliera la maggior parte degli studenti del primo anno.