L'algoritmo di selezione randomizzato è il seguente:
Input: un array di n (distinti, per semplicità) numeri e un numero k ∈ [ n ]
Output: l '" elemento rank " di A (cioè quello in posizione k se A fosse ordinato)
Metodo:
- Se c'è un elemento in , restituiscilo
- Seleziona un elemento (il "perno") in modo uniforme a caso
- Calcola i set e R = { a ∈ A : a > p }
- Se , restituire il rango k elemento di L .
- Altrimenti, restituisce il grado elemento di R
Mi è stata posta la seguente domanda:
Supponiamo che , quindi si sta cercando per la mediana, e lasciare alfa ∈ ( 1 / 2 , 1 ) essere una costante. Qual è la probabilità che, alla prima chiamata ricorsiva, l'insieme contenente la mediana abbia dimensione al massimo α n ?
Mi è stato detto che la risposta è , con la giustificazione "Il perno selezionato dovrebbe trovarsi tra 1 - α e α volte l'array originale"
Perché? Come , qualunque elemento sia scelto come perno è più grande o più piccolo di più della metà degli elementi originali. La mediana si trova sempre nel sottoarray più grande, perché gli elementi nel sottoarray partizionato sono sempre inferiori al perno.
Se il perno si trova nella prima metà dell'array originale (meno della metà di essi), la mediana sarà sicuramente nella seconda metà più grande, perché una volta trovata la mediana, deve essere nella posizione centrale dell'array e tutto ciò che precede il perno è più piccolo come indicato sopra.
Se il perno si trova nella seconda metà dell'array originale (più della metà degli elementi), la mediana sarà sicuramente la prima metà più grande, per lo stesso motivo, tutto ciò che precede il perno è considerato più piccolo.
Esempio:
3 4 5 8 7 9 2 1 6 10
La mediana è 5.
Supponiamo che il perno scelto sia 2. Quindi, dopo la prima iterazione, diventa:
1 2 .... parte più grande ....
Solo 1
e 2
vengono scambiati dopo la prima iterazione. Il numero 5 (la mediana) è ancora nella prima metà maggiore (accodando al perno 2). Il punto è che la mediana si trova sempre sulla metà maggiore, come può avere la possibilità di rimanere in un sottoarray più piccolo?