1. Caso medio e migliore:
* Complessità dello spazio:O (log n)
* Ciò si ottiene quando QuickSort è implementato con le seguenti ottimizzazioni:
* Partizionamento in posto: QuickSort in genere mira a riorganizzare gli elementi direttamente all'interno dell'array originale, minimizzando la necessità di spazio extra per archiviare partizioni intermedie.
* Ottimizzazione delle chiamate di coda (o iterazione): Per gestire le chiamate ricorsive, la partizione più piccola viene sempre elaborata *ricorsivamente *, mentre la partizione più grande viene elaborata *iterativamente *(ad esempio, usando un ciclo anziché un'altra chiamata ricorsiva). Questo aiuta a limitare la profondità massima della ricorsione.
* La complessità dello spazio deriva principalmente dallo stack di chiamate utilizzato per gestire le chiamate ricorsive. Nei casi migliori e medi, la profondità di ricorsione è logaritmica (O (log n)), il che significa che il numero massimo di chiamate di funzione in attesa nello stack è proporzionale alla log n. Ogni chiamata richiede una piccola quantità costante di spazio.
2. Caso peggiore:
* Complessità dello spazio:O (n)
* Lo scenario peggiore si verifica quando l'elemento pivot viene costantemente scelto male, come la selezione sempre dell'elemento più piccolo o più grande. Questo porta a partizioni altamente sbilanciate. Di conseguenza, una partizione contiene solo il perno e l'altra contiene tutti gli elementi `n-1 'rimanenti.
* In questa situazione, la profondità di ricorsione diventa lineare (O (N)). Lo stack di chiamata cresce fino a una profondità di `n`, risultando in una complessità spaziale di O (N).
Riepilogo:
| Caso | Complessità spaziale |
| ------------ | -------------------- |
| Migliore | O (log n) |
| Media | O (log n) |
| Peggiore | O (n) |
Considerazioni importanti:
* In-Place: QuickSort è generalmente considerato un algoritmo di smistamento sul posto perché esegue la maggior parte delle sue operazioni direttamente all'interno dell'array originale. Tuttavia, lo stack di chiamata necessario per la ricorsione contribuisce alla complessità dello spazio.
* Selezione per giri: Le strategie per migliorare la selezione dei perni, come la scelta di un perno casuale o il perno mediano di tre, possono aiutare a ridurre la probabilità dello scenario peggiore.
* QuickSort non regursivo (iterativo): È possibile implementare QuickSort completamente iterativamente utilizzando una struttura di dati dello stack per gestire le partizioni. Ciò può fornire un maggiore controllo sull'uso dello spazio e potenzialmente migliorare le prestazioni, soprattutto quando la profondità di ricorsione è una preoccupazione. La complessità dello spazio dipenderebbe quindi dalla dimensione massima dello stack richiesto, che può ancora essere O (n) nel caso peggiore, ma è più probabile che sia O (log n) con strategie di partizionamento appropriate.
Esempio:
Diciamo che hai un array di 1000 elementi.
* Medio/Caso migliore: È probabile che la profondità di ricorsione massima sia intorno al log₂ (1000) ≈ 10. Quindi, lo spazio necessario per lo stack di chiamata sarebbe proporzionale a 10.
* Caso peggiore: La profondità di ricorsione potrebbe essere 1000 e lo spazio necessario per lo stack di chiamata sarebbe proporzionale a 1000.
In conclusione, mentre QuickSort è spesso descritto come avere O (log n) complessità dello spazio, è fondamentale ricordare che questo è il caso medio con ottimizzazioni come il partizionamento sul posto e l'ottimizzazione della chiamata. La complessità dello spazio peggiore è O (N), che può essere significativo per i set di dati di grandi dimensioni se l'implementazione non è attesa.
software © www.354353.com