La notazione O grande è un mezzo privo di unità per misurare la variazione delle prestazioni, quindi impermeabile ai costi relativi delle primitive computazionali.
In poche parole: la
notazione O grande è un tipo di misura relativa senza unità (al contrario della misurazione assoluta). Può solo misurare la variazione delle prestazioni, non le prestazioni assolute, per le quali le costanti contano molto. Il vantaggio è che ciò lo rende ampiamente indipendente dall'implementazione, consentendo un'analisi più semplice che può ignorare i costi relativi delle operazioni elementari, purché tali costi abbiano limiti superiori e inferiori fissi positivi. Ma la conseguenza è che i fattori costanti sono insignificanti . Tuttavia, anche per lo scopo previsto, l' analisi della complessità asintotica può essere messa in discussione per altri motivi e deve essere considerata con cura. Ad esempio, la dimensione di input non elaborata potrebbe non essere il parametro giusto da considerare.
Una prima osservazione è che la tua domanda non è affermata in modo abbastanza accurato. Quando trascuri la costante in 3 n , c'è effettivamente un "cambiamento di tre volte", ma entrambi variano alla stessa velocità e non puoi affermare che "[una] cosa varia 3 volte più rapidamente delle altre".33n
Un buon motivo per ignorare la costante nella notazione di Landau è che non abbiamo unità su cui contare. Quando qualcuno afferma che A vive due volte più lontano di te rispetto a B, questo ha significato indipendentemente da qualsiasi unità. Possiamo essere d'accordo anche se misurate le distanze in pollici mentre lo faccio in anni luce. Ma la misurazione della distanza assoluta richiede unità specifiche e la sua formulazione numerica dipende dall'unità scelta.
Il tempo effettivo impiegato da un algoritmo dipende dal tempo di esecuzione delle operazioni elementari, che dipende molto dalla macchina. Potresti contare il numero di operazioni elementari, ma non c'è motivo di credere che tutte prendano lo stesso tempo, ed è sempre possibile comporre più operazioni in una singola operazione, o al contrario scomporre un'operazione in operazioni più piccole, in modo che il numero delle operazioni non è veramente significativo, a meno che non si sia d'accordo su una macchina virtuale di riferimento. Essere indipendenti dal riferimento è un vantaggio.
Un'altra visione del vantaggio dell'approccio è che tutto ciò che ti interessa nell'analisi è contare il numero di operazioni elementari, purché il loro costo abbia un limite superiore e un limite inferiore positivo. Non devi preoccuparti dei costi individuali.
Tuttavia, il prezzo da pagare per quel vantaggio è che la valutazione del costo di calcolo viene fornita con unità non specificata e il tempo di calcolo, ad esempio, potrebbe essere di nanosecondi o millenni - non proviamo nemmeno a saperlo. In altre parole, i fattori costanti sono insignificanti, poiché la modifica delle unità è inseparabile dalla modifica del fattore costante e non vengono utilizzate unità di riferimento.
Come notato da Patrick87 , questo è sufficiente per capire come un algoritmo si ridimensiona rispetto alla dimensione dell'input, ma non fornirà una misura assoluta delle prestazioni, a meno di fare affidamento su un'unità di riferimento. Non è possibile eseguire una macchina astratta di riferimento comune quando si desidera effettivamente confrontare le prestazioni di algoritmi distinti, ma è più difficile assicurarsi che il confronto non sia distorto dai dettagli di realizzazione. Nella complessità asintotica, questo rischio è evitato perché si confronta l'algoritmo con se stesso.
Comunque, solo un programmatore ingenuo farebbe affidamento esclusivamente sulla complessità asintotica per scegliere un algoritmo. Esistono molti altri criteri, tra cui la costante indicibile e il costo effettivo delle operazioni elementari. Inoltre, la complessità del caso peggiore può essere un indicatore scarso, perché la fonte della complessità del caso peggiore può verificarsi raramente e su frammenti dell'input abbastanza piccoli da avere un impatto limitato. Ad esempio i parser generali per Tree Adjoining Grammars hanno una complessità teorica e sono abbastanza utilizzabili nella pratica. Il caso peggiore che conosco è l'
inferenza di tipo polimorfico di Damas-Hindley-MilnerO(n6)algoritmo utilizzato per ML, che presenta una complessità esponenziale nel caso peggiore. Ma ciò non sembra disturbare gli utenti ML, né impedire la scrittura di programmi molto grandi in ML. C'è più della costante che conta. In realtà, l'analisi asintotica mette in relazione una misura del costo di un calcolo con una misura della complessità dell'input. Ma la dimensione grezza potrebbe non essere la misura giusta.
La complessità è come la decidibilità, può essere teoricamente negativa, ma può essere irrilevante per la maggior parte dello spazio dati ... a volte. L'analisi della complessità asintotica è uno strumento valido e ben progettato, con i suoi vantaggi e i suoi limiti, come tutti gli strumenti. Con o senza esplicitare la costante, che può essere insignificante, è necessario usare il giudizio.