Analisi probabilistica di quicksort e quickselect
In questa pagina 7
Quicksort e il suo parente quickselect sono gli esempi più puliti di analisi probabilistica: il caso pessimo è quadratico (Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →, Complessità in tempo e caso pessimoPerché lo studio sperimentale non basta; complessità al caso pessimo come massimo sul numero di operazioni tra le istanze di una data taglia; stima con limiti superiore e inferiore senza trovare l'istanza peggiore; esempi arrayMax, prefixAverages e InsertionSort; efficienza asintotica e limiti dell'analisi.Complessità in tempo e caso pessimo →), ma scegliendo il pivot a caso il costo atteso è per ogni input. Qui si calcola esattamente, con le variabili indicatrici di Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →.
Il modello
Chiavi tutte distinte (con ripetizioni basta una partizione a tre parti). Il costo è il numero di confronti tra chiavi: le altre operazioni (scambi, chiamate) sono proporzionali a questo.
import random
def quicksort(a, cnt): # cnt[0] conta i confronti
if len(a) <= 1:
return a
p = random.choice(a) # pivot uniforme tra gli elementi
lo = [x for x in a if x < p]
hi = [x for x in a if x > p]
cnt[0] += len(a) - 1 # il pivot è confrontato con ogni altro elemento
return quicksort(lo, cnt) + [p] + quicksort(hi, cnt)Sia il numero di confronti su chiavi. Nei conti si indica con la sequenza ordinata delle chiavi: è l'elemento di rango , qualunque sia la sua posizione iniziale.
Esempio (una esecuzione). , quindi . Pivot : confronti, , . Su il pivot : confronti, , . Totale confronti. Sono state confrontate le coppie e ; mai due volte la stessa coppia, perché dopo il confronto il pivot esce dal problema. Con altri pivot i confronti sarebbero stati tra (minimo per ) e (caso pessimo).
Probabilità che due elementi vengano confrontati
Lemma. Per , e sono confrontati (al più una volta) con probabilità
Dimostrazione. Sia , di elementi. Finché nessun elemento di è stato scelto come pivot, tutti restano nello stesso sottoproblema (un pivot esterno a è minore o maggiore di tutti, quindi li manda dalla stessa parte). Consideriamo il primo elemento di scelto come pivot: per simmetria è uniforme su .
- Se è o , viene confrontato con l'altro: confronto.
- Se è uno degli altri, e finiscono in parti diverse e non si incontreranno più: nessun confronto.
I casi favorevoli sono su .
Esempio (). Le coppie con (adiacenti) sono sempre confrontate: probabilità ; con : ; con : ; con (): . Per vale : sono confrontati solo se il primo pivot dell'intero insieme è o .
Numero atteso di confronti
Sia se sono confrontati. Ogni coppia è confrontata al più una volta, quindi e per linearità perché le coppie con sono (scelto da a , ). Si separa :
Teorema. , con . In particolare .
Esempi. : la somma sulle coppie vale ; la formula dà . Altri valori: , , , . Per : , cioè (il coefficiente si raggiunge molto lentamente per il termine negativo ); contro del caso pessimo.
Grafico interattivo: Confronti di quicksort con pivot casuale: attesa 2(n+1)H_n - 4n (con H_n approssimato) contro il caso pessimo n(n-1)/2
Ricorrenza alternativa
Dimostrazione senza coppie. Il pivot ha rango uniforme in (probabilità ciascuno); lascia sottoproblemi di taglia e , ciascuno con la stessa distribuzione di partenza (su chiavi distinte). Condizionando sul rango (Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →, attesa condizionata): (qui indica l'attesa). Si moltiplica per : ; scrivendo lo stesso per e sottraendo, la somma sparisce: Si divide per : , e (denominatore comune: ). Srotolando fino a : cioè , come sopra. Controllo: e ; .
Pivot casuale o input casuale
Due modelli diversi danno la stessa media:
- Algoritmo randomizzato: pivot uniforme, input qualunque (anche il peggiore). La media è su scelte dell'algoritmo, sempre .
- Analisi del caso medio: pivot fisso (per esempio l'ultimo), input permutazione uniforme. Il pivot ha rango uniforme e, dato il rango, le due parti sono ancora permutazioni uniformi dei loro elementi: la ricorrenza è la stessa. Con la media sulle permutazioni è .
La differenza è che nel secondo caso un input ordinato dà sempre confronti (per : ), mentre nel primo nessun input è peggiore degli altri: la probabilità di toccare il caso pessimo è piccola.
Proprietà. Il caso pessimo è raggiunto solo se ogni pivot è il minimo o il massimo del suo sottoproblema. Un sottoproblema di taglia lo permette con probabilità , quindi .
Esempio. : ; : . Per la distribuzione esatta è con probabilità , con , con , media .
Las Vegas. Quicksort randomizzato è sempre corretto e ha tempo aleatorio. Per Markov (Disuguaglianze di Markov, Chebyshev e JensenMarkov: per X ≥ 0, P(X ≥ a) ≤ E[X]/a; Chebyshev: P(|X − μ| ≥ ε) ≤ Var(X)/ε²; Jensen: per φ convessa, φ(E[X]) ≤ E[φ(X)]. Stimano probabilità e medie conoscendo solo media e varianza.Disuguaglianze di Markov, Chebyshev e Jensen →) : la probabilità di costare più di volte la media è al più . È una stima debole (la vera probabilità di superare di un fattore costante la media è molto più piccola, come si dimostra con i metodi di Momenti e deviazioni - Markov, Chebyshev e mediana randomizzataVar(ΣX_i) = ΣVar + 2ΣCov, e basta l'indipendenza a coppie perché la varianza si sommi. Chebyshev dà code polinomiali (collezionista: P(T ≥ nH_n + cn) ≤ π²/(6c²)); il metodo del secondo momento dà P(X=0) ≤ Var(X)/E[X]². Algoritmo della mediana: campione di n^(3/4) elementi, due estremi d e u a ±√n, ordinamento dei soli elementi tra d e u; fallisce con probabilità ≤ n^(-1/4) ed è Las Vegas con 2n + o(n) confronti.Momenti e deviazioni - Markov, Chebyshev e mediana randomizzata → e Limiti di Chernoff e di HoeffdingMarkov applicato a e^(tX) dà code esponenziali. Per somme di Bernoulli indipendenti con media μ: P(X ≥ (1+δ)μ) ≤ [e^δ/(1+δ)^(1+δ)]^μ ≤ e^(-δ²μ/3) per 0<δ≤1, P(X ≤ (1-δ)μ) ≤ e^(-δ²μ/2), P(X ≥ R) ≤ 2^(-R) se R ≥ 6μ. Hoeffding per X_i in [a_i,b_i]: P(|S-E[S]| ≥ t) ≤ 2exp(-2t²/Σ(b_i-a_i)²). Applicazioni: n ≥ ln(2/δ)/(2ε²) campioni per stimare una probabilità, amplificazione BPP con k = O(log 1/ε) ripetizioni, bilanciamento di insiemi con scarto √(4m ln n).Limiti di Chernoff e di Hoeffding →).
Quickselect
Problema: dato un insieme di chiavi distinte, trovare l'elemento di rango (la selezione; è la mediana) senza ordinare tutto.
def quickselect(a, k, cnt): # k-esimo più piccolo, k da 1
while True:
p = random.choice(a)
lo = [x for x in a if x < p]
hi = [x for x in a if x > p]
cnt[0] += len(a) - 1
if k <= len(lo):
a = lo
elif k == len(lo) + 1:
return p
else:
k -= len(lo) + 1
a = hiDopo il pivot si scende in una sola parte (quella che contiene il rango cercato). Esempio: , (la risposta è ). Pivot : confronti, (4 elementi, ). Pivot : confronti, , , quindi e . Pivot : confronto, , ; poi pivot di un elemento e : ritorna . Totale confronti.
Teorema. Il numero atteso di confronti di quickselect su elementi è al più , per ogni .
Dimostrazione (induzione). Sia il massimo su dell'attesa. Il pivot ha rango uniforme; costa confronti e si prosegue in un sottoproblema di taglia al più . Quindi . I valori vanno da a , ciascuno al più due volte. Per ipotesi induttiva e dove (per pari vale ; per dispari ).
Il motivo: con probabilità il pivot è nella metà centrale e l'insieme cala almeno di un quarto; le taglie decrescono in modo geometrico e la somma .
Valore esatto. Con la stessa tecnica della ricorrenza si ottiene Per (il minimo) diventa : per è . Per la mediana (: ). Cercare il minimo con quickselect costa quindi circa : il doppio dei confronti della scansione lineare, ma l'algoritmo vale per ogni . Nel caso pessimo il costo di quickselect è , ma con probabilità trascurabile; esiste anche un algoritmo deterministico lineare nel caso pessimo, molto più complicato.
Domande d'esame
- Dimostra che sono confrontati con probabilità . Si considera il primo pivot scelto in : uniforme su elementi, e si confronta solo se è o .
- Calcola . .
- Probabilità che quicksort randomizzato su elementi faccia il numero massimo di confronti. , perché ogni pivot deve essere un estremo.
- Perché quickselect è lineare mentre quicksort no? Si scende in una sola parte e il costo per livello decresce in modo geometrico: con soluzione .
Versione ripasso
- Modello: pivot uniforme, confronti per partizione, = confronti totali; chiavi , il rango non dipende dalla posizione. Ogni coppia è confrontata al più una volta: il pivot esce dal problema (Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →, Complessità in tempo e caso pessimoPerché lo studio sperimentale non basta; complessità al caso pessimo come massimo sul numero di operazioni tra le istanze di una data taglia; stima con limiti superiore e inferiore senza trovare l'istanza peggiore; esempi arrayMax, prefixAverages e InsertionSort; efficienza asintotica e limiti dell'analisi.Complessità in tempo e caso pessimo →). Esecuzione su con pivot poi : confronti.
- Lemma: per , . Dimostrazione: finché nessun elemento di è pivot restano insieme; il primo pivot di è uniforme su elementi; confronto solo se è o (se è interno li separa). Per : per .
- Attesa: (Linearità del valore atteso e variabili indicatriciLa linearità $E[X+Y]=E[X]+E[Y]$ vale sempre, anche senza indipendenza; con le variabili indicatrici ($E[I_A]=P(A)$) trasforma un conteggio in una somma di probabilità. Applicazioni: attesa del primo successo $1/p$, collezionista di figurine $nH_n$, punti fissi di una permutazione (media $1$), record (media $H_n$), inversioni ($n(n-1)/4$), attesa condizionata, identità di Wald $E[S_N]=E[N]E[X]$.Linearità del valore atteso e variabili indicatrici →). , più esattamente . Valori: , , , , , .
- Ricorrenza: ; sottraendo il caso : ; ; srotolando , stessa formula.
- Pivot fisso su input casuale = pivot casuale su input qualunque (stessa ricorrenza: rango del pivot uniforme, parti ancora casuali). Caso pessimo solo se ogni pivot è un estremo: probabilità (: ). Markov (Disuguaglianze di Markov, Chebyshev e JensenMarkov: per X ≥ 0, P(X ≥ a) ≤ E[X]/a; Chebyshev: P(|X − μ| ≥ ε) ≤ Var(X)/ε²; Jensen: per φ convessa, φ(E[X]) ≤ E[φ(X)]. Stimano probabilità e medie conoscendo solo media e varianza.Disuguaglianze di Markov, Chebyshev e Jensen →): ; la concentrazione fine è in Momenti e deviazioni - Markov, Chebyshev e mediana randomizzataVar(ΣX_i) = ΣVar + 2ΣCov, e basta l'indipendenza a coppie perché la varianza si sommi. Chebyshev dà code polinomiali (collezionista: P(T ≥ nH_n + cn) ≤ π²/(6c²)); il metodo del secondo momento dà P(X=0) ≤ Var(X)/E[X]². Algoritmo della mediana: campione di n^(3/4) elementi, due estremi d e u a ±√n, ordinamento dei soli elementi tra d e u; fallisce con probabilità ≤ n^(-1/4) ed è Las Vegas con 2n + o(n) confronti.Momenti e deviazioni - Markov, Chebyshev e mediana randomizzata →.
- Quickselect: si scende in una sola parte. , e per induzione (taglie quasi geometriche, ). Esatto: ; minimo (: ), mediana . Esempio , : pivot , risposta , confronti.
- Passaggi da saper riscrivere all'orale: (1) lemma con l'insieme ; (2) numero di coppie con uguale a e somma ; (3) ricorrenza e sottrazione di due equazioni consecutive; (4) ; (5) induzione . Distribuzione esatta per : confronti con probabilità , media .
- Errori tipici: contare due volte la stessa coppia; dimenticare che il pivot esce dal problema; scrivere come valore esatto (manca ); dire che quickselect è nel caso pessimo.
Esercizi su questo argomento
- Esercizio - confronti attesi di quicksort su 5 elementi, tre metodi
- Esercizio - distribuzione esatta dei confronti di quicksort su 6 elementi e caso pessimo
- Esercizio - quali coppie vengono confrontate, confronti del minimo e della mediana in quicksort
- Esercizio - quickselect, confronti attesi per il minimo, la mediana e il massimo
- Esercizio - ricorrenza di quicksort, forma chiusa e confronto con n log n