Qui per analisi asintotica presumo che intendiamo il comportamento dell'algoritmo quando la dimensione dell'input va all'infinito.
Il motivo per cui utilizziamo l'analisi asintotica è perché
è utile nel prevedere il comportamento degli algoritmi nella pratica . Le previsioni ci consentono di prendere decisioni, ad esempio quando abbiamo algoritmi diversi per un problema quale dovremmo usare? (Essere utili non significa che sia sempre corretto.)
La stessa domanda può essere posta su qualsiasi modello semplificato del mondo reale. Perché utilizziamo modelli matematici semplificati del mondo reale?
Pensa alla fisica. La fisica newtoniana classica non è buona quanto la fisica relativistica nel predire il mondo reale. Ma è un modello abbastanza buono per costruire automobili, grattacieli, sottomarini, aeroplani, ponti, ecc. Ci sono casi in cui non è abbastanza buono, ad esempio se vogliamo costruire un satellite o inviare una sonda spaziale a Plutone o prevedere il movimento di enormi oggetti celesti come stelle e pianeti o oggetti ad altissima velocità come elettroni.
È importante sapere quali sono i limiti di un modello.
È in genere un'approssimazione abbastanza buona del mondo reale.
In pratica vediamo spesso che un algoritmo con una migliore analisi asintotica funziona meglio nella pratica. Raramente è un caso che un algoritmo abbia un comportamento asintotico migliore. Quindi, se gli input possono essere abbastanza grandi, in genere possiamo fare affidamento sull'analisi asintotica come prima previsione del comportamento degli algoritmi. Non è così se sappiamo che gli input saranno piccoli. A seconda delle prestazioni che desideriamo, potremmo aver bisogno di fare un'analisi più attenta, ad es. Se abbiamo informazioni sulla distribuzione degli input che verrà fornita l'algoritmo, possiamo fare un'analisi più attenta per raggiungere gli obiettivi che abbiamo (ad es. Veloce su 99 % di input). Il punto è come primo passo l'analisi asintotica è un buon punto di partenza. In pratica dovremmo anche effettuare test delle prestazioni, ma tieni presente che ha anche i suoi problemi.
AAAha una migliore complessità asintotica. Quali di questi non sono migliori dell'altro in tutti gli input? Quindi diventa più complicato e dipende da ciò a cui teniamo. Ci preoccupiamo per input di grandi dimensioni o input di piccole dimensioni? Se ci preoccupiamo di input di grandi dimensioni, non è comune che un algoritmo abbia una migliore complessità asintotica ma si comporti peggio di input di grandi dimensioni che ci interessano. Se ci preoccupiamo di più di piccoli input, l'analisi asintotica potrebbe non essere così utile. Dovremmo confrontare il tempo di esecuzione degli algoritmi sugli input che ci interessano. In pratica, per compiti complicati con requisiti complessi l'analisi asintotica potrebbe non essere altrettanto utile. Per semplici problemi di base coperti dai manuali di algoritmo è abbastanza utile.
In breve, la complessità asintotica è un'approssimazione relativamente facile da calcolare della complessità effettiva degli algoritmi per semplici compiti di base (problemi in un manuale di algoritmi). Man mano che costruiamo programmi più complicati, i requisiti di prestazione cambiano e diventano più complicati e l'analisi asintotica potrebbe non essere altrettanto utile.
È bene confrontare l'analisi asintotica con altri approcci per prevedere le prestazioni degli algoritmi e confrontarli. Un approccio comune è il test delle prestazioni rispetto a input casuali o benchmark. È comune quando il calcolo della complessità asintotica è difficile o non fattibile, ad esempio quando stiamo usando l'euristica come nella risoluzione SAT. Un altro caso è quando i requisiti sono più complicati, ad esempio quando le prestazioni di un programma dipendono da fattori esterni e il nostro obiettivo potrebbe essere quello di avere qualcosa che termina con dei limiti di tempo fissi (ad es. Pensare all'aggiornamento dell'interfaccia mostrata a un utente) sul 99% del ingressi.
Ma tieni presente che anche l'analisi delle prestazioni ha i suoi problemi. Non fornisce concessioni matematiche sulle prestazioni a meno che effettivamente eseguiamo il test delle prestazioni su tutti gli input che verranno dati all'algoritmo (spesso non calcolabili dal punto di vista computazionale) (e spesso non è possibile decidere che alcuni input non verranno mai forniti). Se ci prova su contro un campione casuale o un punto di riferimento stiamo implicitamente assumendo una certa regolarità
sulle prestazioni degli algoritmi, ovvero l'algoritmo eseguire in modo simile a input che non erano parte del test prestazioni.
Il secondo problema con i test delle prestazioni è che dipendono dall'ambiente di test. Vale a dire che le prestazioni di un programma non sono determinate dai soli input ma da fattori esterni (ad es. Tipo di macchina, sistema operativo, efficienza dell'algoritmo codificato, utilizzo della CPU, tempi di accesso alla memoria, ecc.) Alcuni dei quali potrebbero variare tra le diverse serie di il test sulla stessa macchina. Anche in questo caso stiamo assumendo che gli ambienti particolari in cui viene eseguito il test delle prestazioni siano simili all'ambiente reale a meno che non eseguiamo i test delle prestazioni su tutti gli ambienti in cui è possibile eseguire il programma (e come possiamo prevedere su quali macchine qualcuno potrebbe eseguire un ordinamento algoritmo attivo tra 10 anni?).
Θ(nlgn)Θ(n2)Θ(lgn)O(n)