Salta al contenuto
Note per Studenti Esercizio - quali coppie vengono confrontate, confronti del minimo e della mediana in quicksort

Esercizio - quali coppie vengono confrontate, confronti del minimo e della mediana in quicksort

Teoria: Analisi probabilistica di quicksort e quickselectCon pivot casuale due elementi di rango $i<j$ vengono confrontati con probabilità $2/(j-i+1)$; sommando sulle coppie il numero atteso di confronti di quicksort è esattamente $2(n+1)H_n-4n\approx2n\ln n-2{,}85,n$ (stessa formula dalla ricorrenza $C_n=n-1+\frac2n\sum_{k<n}C_k$). Quickselect trova il $k$-esimo elemento con attesa lineare, al più $4n$ confronti (mediana $\approx3{,}39,n$). Pivot fisso su input casuale equivale a pivot casuale su input qualunque.Analisi probabilistica di quicksort e quickselect → (lemma sulla probabilità di confronto).

Testo. Quicksort con pivot casuale ordina n=10n=10 chiavi distinte z1<⋯<z10z_1<\dots<z_{10}.

  1. Probabilità che z3z_3 e z7z_7 siano confrontati; che lo siano z1z_1 e z10z_{10}; che lo siano due chiavi adiacenti.
  2. Numero atteso di confronti in cui interviene il minimo z1z_1; e la mediana (z5z_5).
  3. Controllare che, sommando su tutti gli elementi, si ottiene il doppio di E[C10]E[C_{10}].
  4. Domanda da orale: dimostrare il lemma P(zi,zj confrontati)=2j−i+1P(z_i,z_j\text{ confrontati})=\frac2{j-i+1}.

Soluzione

1. Probabilità. Per il lemma P=2j−i+1P=\frac2{j-i+1}.

  • z3,z7z_3,z_7: j−i+1=5j-i+1=5, P=25P=\frac25.
  • z1,z10z_1,z_{10}: j−i+1=10j-i+1=10, P=15P=\frac15 (sono confrontati solo se il primo pivot dell'intero insieme è uno dei due estremi).
  • Adiacenti (j=i+1j=i+1): P=22=1P=\frac22=1, perché tra i due non ci sono elementi che possano separarli: prima o poi uno dei due è pivot mentre l'altro è ancora nel suo problema.

2. Confronti di un elemento. Sia YrY_r il numero di confronti che coinvolgono zrz_r. Per linearità E[Yr]=∑j≠rP(zr,zj confrontati)=∑j≠r2∣j−r∣+1E[Y_r]=\sum_{j\ne r}P(z_r,z_j\text{ confrontati})=\sum_{j\ne r}\frac2{|j-r|+1}.

  • r=1r=1: ∑j=2102j=2(H10−1)=2⋅1,9290=3,858\sum_{j=2}^{10}\frac2j=2(H_{10}-1)=2\cdot1{,}9290=3{,}858.
  • r=5r=5: a destra (distanze d=1..5d=1..5, dunque j−r+1=2..6j-r+1=2..6): 2(H6−1)=2⋅1,45=2,92(H_6-1)=2\cdot1{,}45=2{,}9; a sinistra (d=1..4d=1..4, valori 2..52..5): 2(H5−1)=2⋅1,2833=2,56672(H_5-1)=2\cdot1{,}2833=2{,}5667. Totale 5,4675{,}467.

In generale E[Yr]=2(Hr−1)+2(Hn−r+1−1)E[Y_r]=2(H_r-1)+2(H_{n-r+1}-1): il minimo e il massimo sono confrontati meno degli elementi centrali, ma di poco (3,863{,}86 contro 5,475{,}47 con n=10n=10).

3. Somma. Ogni confronto coinvolge due elementi, quindi ∑rYr=2Cn\sum_rY_r=2C_n e ∑rE[Yr]=2E[Cn]\sum_rE[Y_r]=2E[C_n]. Calcolando i dieci valori E[Yr]E[Y_r] per r=1..10r=1..10 e sommando si ottiene 48,87548{,}875, e 2E[C10]=2 (2⋅11⋅H10−40)=2⋅24,437=48,8752E[C_{10}]=2\,(2\cdot11\cdot H_{10}-40)=2\cdot24{,}437=48{,}875. ✓

4. Dimostrazione del lemma. Sia Zij={zi,…,zj}Z_{ij}=\{z_i,\dots,z_j\}. Finché nessun elemento di ZijZ_{ij} è stato scelto come pivot, i suoi elementi stanno nello stesso sottoproblema: un pivot esterno è minore o maggiore di tutti, quindi li lascia insieme. Il primo elemento di ZijZ_{ij} scelto come pivot è uniforme su ZijZ_{ij} (ogni pivot è scelto a caso nel proprio sottoproblema, che contiene tutto ZijZ_{ij}). Se è ziz_i o zjz_j, i due vengono confrontati; se è interno, li separa e non saranno mai confrontati. La probabilità è 2j−i+1\frac2{j-i+1}. □\square

Risultato. 25\frac25, 15\frac15 e 11; E[Y1]=2(H10−1)≈3,858E[Y_1]=2(H_{10}-1)\approx3{,}858, E[Y5]≈5,467E[Y_5]\approx5{,}467; ∑rE[Yr]=48,875=2E[C10]\sum_rE[Y_r]=48{,}875=2E[C_{10}].

Verifica Python: le probabilità sono calcolate con la ricorrenza esatta sul rango del pivot (pcomp: 25\frac25, 11, 15\frac15) e coincidono con 2j−i+1\frac2{j-i+1}; simulazione dei confronti del minimo e della mediana su 60 00060\,000 esecuzioni: 3,8563{,}856 e 5,4815{,}481.

Versione ripasso

Teoria collegata