Cos'è l'analisi ammortizzata degli algoritmi? [chiuso]


85

In cosa differisce dall'analisi asintotica? Quando lo usi e perché?

Ho letto alcuni articoli che sembrano essere stati scritti bene, come questi:

ma non ho ancora compreso appieno questi concetti.

Quindi, qualcuno può semplificarlo per me?


5
Probabilmente appartiene a programmers.stackexchange.com
lanzz

2
@lanzz Forse ora apparterrebbe a cs.stackexchange.com
nbro

Un grande thread sul significato di Constant Amortized Time .
RBT

Risposte:


88

L'analisi ammortizzata non moltiplica ingenuamente il numero di invocazioni con il caso peggiore per una chiamata.

Ad esempio, per un array dinamico che raddoppia le dimensioni quando necessario, la normale analisi asintotica concluderebbe solo che l'aggiunta di un elemento costa O (n), perché potrebbe essere necessario aumentare e copiare tutti gli elementi nel nuovo array. L'analisi ammortizzata tiene conto del fatto che per dover crescere, n / 2 elementi devono essere stati aggiunti senza causare una crescita rispetto alla crescita precedente, quindi l'aggiunta di un elemento richiede solo O (1) (il costo di O (n) è ammortizzato in n / 2 azioni).

L'analisi ammortizzata non è la stessa di una "performance media": l'analisi ammortizzata fornisce una garanzia concreta su ciò che la performance farà se si eseguono così tante azioni.


1
"L'analisi ammortizzata tiene conto del fatto che per dover crescere, n / 2 elementi devono essere stati aggiunti senza causare una crescita rispetto alla crescita precedente, quindi l'aggiunta di un elemento richiede solo O (1) (il costo di O (n) è ammortizzato in n / 2 azioni). " Questo era abbastanza confuso e poco chiaro.
AleksandrH,

@ AleksandrH qualche parte particolare di esso?
Harold

Sì, è solo difficile seguire la matematica senza una spiegazione della provenienza dei numeri
AleksandrH,

44

Ci sono molte risposte al "cosa", ma nessuna al "perché".

Come tutti gli altri hanno detto, l'analisi asintotica riguarda il modo in cui le prestazioni di una data operazione si adattano a un ampio set di dati. L'analisi ammortizzata riguarda la scala della media delle prestazioni di tutte le operazioni su un ampio set di dati. L'analisi ammortizzata non dà mai limiti peggiori dell'asintotico, e talvolta ne dà di molto migliori.

Se sei preoccupato per il tempo di esecuzione totale di un lavoro più lungo, i limiti migliori dell'analisi ammortizzata sono probabilmente ciò che ti interessa. Questo è il motivo per cui i linguaggi di scripting (ad esempio) sono spesso felici di aumentare gli array e le tabelle hash di qualche fattore anche se questa è un'operazione costosa. (La crescita può essere O(n)un'operazione, ma ammortizzata è O(1)perché la fai raramente.)

Se stai facendo una programmazione in tempo reale (le singole operazioni devono essere completate in un tempo prevedibile), i limiti migliori dell'analisi ammortizzata non hanno importanza. Non importa se l'operazione è stata mediamente veloce, se non sei riuscito a finirla in tempo per tornare indietro e regolare la sega a nastro prima che tagliasse troppo ...

Quello che conta nel tuo caso dipende esattamente dal tuo problema di programmazione.


1
"La crescita può essere un'operazione O (n), ma ammortizzata è O (1) perché lo fai raramente" Penso che questa affermazione abbia davvero bisogno di una dimostrazione matematica di rigore.
nbro

"Se stai programmando in tempo reale ..." dovresti essere più preciso e spiegare esattamente perché quel paragrafo dovrebbe essere considerato "vero".
nbro

1
@nbro Perché pensi "dovrebbe"? La domanda chiede in che modo l'analisi ammortizzata differisce da quella asintotica e quando si desidera utilizzarli. Si collega ad articoli che spiegano come eseguirli. Quindi l'analisi matematica sembra ridondante. Per quanto riguarda la programmazione in tempo reale, ho fatto spiegare. La programmazione in tempo reale è una programmazione in cui le singole operazioni devono essere completate in un tempo prevedibile. Un tipico esempio è nella programmazione incorporata in cui è necessario monitorare qualcosa a intervalli regolari. Come il controllo dei macchinari. In questo caso, operazioni lente occasionali non sono accettabili.
btilly

27

Analisi asintotica

Questo termine si riferisce all'analisi delle prestazioni dell'algoritmo partendo dal presupposto che i dati su cui opera l'algoritmo (l' input ) sono, in parole povere, "abbastanza grandi che ingrandirli non cambierà la conclusione". Sebbene non sia necessario specificare la dimensione esatta dell'input (è necessario solo un limite superiore), è necessario specificare il set di dati stesso .

Si noti che finora abbiamo parlato solo del metodo di analisi; non abbiamo specificato esattamente quale quantità stiamo analizzando (complessità temporale? complessità spaziale?), né abbiamo specificato a quale metrica siamo interessati (caso peggiore? caso migliore? media?).

In pratica, il termine analisi asintotica si riferisce comunemente alla complessità del tempo limite superiore di un algoritmo, ovvero la prestazione nel caso peggiore misurata dal tempo di esecuzione totale, che è rappresentata dalla notazione big-Oh (ad esempio un algoritmo di ordinamento potrebbe essere O(nlogn)).

Analisi ammortizzata

Questo termine si riferisce all'analisi delle prestazioni dell'algoritmo basata su una sequenza specifica di operazioni che ha come obiettivo lo scenario peggiore, ovvero l'analisi ammortizzata implica che la metrica è la prestazione peggiore (sebbene non dica ancora quale quantità viene misurata ). Per eseguire questa analisi, è necessario specificare la dimensione dell'input, ma non è necessario fare ipotesi sulla sua forma.

In parole povere, l'analisi ammortizzata sta scegliendo una dimensione arbitraria per l'input e quindi "giocando" l'algoritmo. Ogni volta che deve essere presa una decisione che dipende dall'input, viene presa la strada peggiore¹. Dopo che l'algoritmo è stato completato, dividiamo la complessità calcolata per la dimensione dell'input per produrre il risultato finale.

¹nota: per essere precisi, il percorso peggiore teoricamente possibile . Se hai un vettore che raddoppia dinamicamente le dimensioni ogni volta che la sua capacità viene esaurita, "caso peggiore" non significa presumere che dovrà raddoppiare ad ogni inserimento perché gli inserimenti vengono elaborati come una sequenza. Ci è consentito (e in effetti dobbiamo) utilizzare lo stato noto per eliminare matematicamente quanti più casi "anche peggiori" possibile, anche se l'input rimane sconosciuto.

La differenza più importante

La differenza fondamentale tra l'analisi asintotica e quella ammortizzata è che la prima dipende dall'input stesso, mentre la seconda dipende dalla sequenza di operazioni che l'algoritmo eseguirà.

Perciò:

  • L'analisi asintotica ci consente di affermare che la complessità dell'algoritmo quando viene fornito un input di caso migliore / peggiore / medio di dimensione prossima a N è delimitata da una funzione F (N) - dove N è una variabile
  • l'analisi ammortizzata ci permette di affermare che la complessità dell'algoritmo quando gli viene fornito un input di caratteristiche sconosciute ma la dimensione nota N non è peggiore del valore di una funzione F (N) - dove N è un valore noto

7
La risposta sopra dimostra perché le persone non dovrebbero votare ciecamente risposte lunghe da persone di alto livello.
btilly

2
@btilly: il tuo feedback sarebbe molto più utile se fosse utilizzabile, ovvero, puoi darmi un'idea di cosa c'è esattamente di sbagliato in questa risposta e come migliorarla?
Jon

7
da dove cominciare? Hai definito entrambi i termini sbagliati e hai fornito molti dettagli chiarificatori che erano sbagliati. Per un esempio casuale, l'analisi ammortizzata non è sempre il caso peggiore. Altrimenti non potremmo dire che la performance ammortizzata dell'inserimento in un hash ridimensionato dinamicamente sia O(1).
btilly

@btilly CLRS pagina 451 dice "... l'analisi ammortizzata garantisce le prestazioni medie di ogni operazione nel caso peggiore."
Glen Selle

1
@GlenSelle L'analisi ammortizzata è una tecnica matematica. Può essere utilizzato per una varietà di scopi, comprese le prestazioni nel caso peggiore. Tuttavia non deve essere il caso peggiore. Nel tuo caso, a quanto pare, è stato usato per un caso peggiore. Nel caso dell'hashing, non lo era.
btilly

14

La risposta a questo è sinteticamente definita dalla prima frase del capitolo Analisi ammortizzata nel libro - Introduzione agli algoritmi:

In un'analisi ammortizzata , il tempo necessario per eseguire una sequenza di operazioni sulla struttura dei dati viene calcolato come media di tutte le operazioni eseguite.

Rappresentiamo la complessità della crescita di un programma mediante l'analisi asintotica, che limita la crescita del programma a una funzione e ne definisce il caso peggiore, migliore o medio.

Ma questo può essere fuorviante nei casi in cui c'è solo un caso in cui la complessità del programma raggiunge un picco, ma in generale, il programma non richiede molti calcoli.

Quindi, ha più senso fare la media del costo su una sequenza di operazioni, anche se una singola operazione potrebbe essere costosa. Questa è un'analisi ammortizzata!

L'analisi ammortizzata è un'alternativa alla tecnica asintotica utilizzata per calcolare la complessità. Ci aiuta a calcolare una complessità più vera in termini di praticità, in modo da confrontare e decidere tra due o più algoritmi.


5

Il miglior riferimento che ho trovato finora per comprendere l'analisi ammortizzata degli algoritmi, si trova nel libro Introduzione agli algoritmi , terza edizione, capitolo 17: "Analisi ammortizzata". È tutto lì, spiegato molto meglio di quello che può essere trovato in un post di Stack Overflow. Troverai il libro nella biblioteca di qualsiasi università decente.


Sì. Leggere l'algoritmo ammortizzato dal libro citato è stato migliore e ha dato finalmente chiarezza.
Rajesh Mappu

2

L'analisi asintotica regolare esamina le prestazioni di una singola operazione in modo asintotico, in funzione della dimensione del problema. La notazione O () è ciò che indica un'analisi asintotica.

L'analisi ammortizzata (che è anche un'analisi asintotica) esamina le prestazioni totali di più operazioni su una struttura dati condivisa .

La differenza è che l'analisi ammortizzata in genere dimostra che il calcolo totale richiesto per le operazioni M ha una garanzia di prestazione migliore di M volte il caso peggiore per la singola operazione.

Ad esempio, una singola operazione su un albero splay di dimensione N può richiedere fino a O (N) tempo. Tuttavia, una sequenza di operazioni M su un albero di dimensione N è limitata dal tempo O (M (1 + log N) + N log N), che è approssimativamente O (log N) per operazione. Tuttavia, si noti che un'analisi ammortizzata è molto più rigorosa di un'analisi "caso medio": dimostra che ogni possibile sequenza di operazioni soddisferà il suo caso peggiore asintotico.


1

L'analisi ammortizzata si occupa del costo totale su un numero di esecuzioni della routine e dei vantaggi che possono essere ottenuti in questo. Ad esempio, la ricerca di una matrice non ordinata di n elementi per una singola corrispondenza può richiedere fino a n confronti e quindi è o (n) complessità. Tuttavia, se sappiamo che lo stesso array verrà cercato per m elementi, la ripetizione dell'attività totale avrebbe quindi complessità O (m * n). Tuttavia, se ordiniamo l'array in anticipo, il costo è O (n log (n)) e le ricerche successive richiedono solo O (log (n)) per un array ordinato. Pertanto, il costo ammortizzato totale per m elementi che adottano questo approccio è O (n * log (n) + m * log (n)). Se m> = n, ciò equivale a O (n log (n)) preordinando rispetto a O (n ^ 2) per non ordinamento. Pertanto il costo ammortizzato è più conveniente.

In parole povere, spendendo un po 'di più all'inizio, possiamo risparmiare molto in seguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.