Sto lavorando a un'implementazione variante Quicksort basata su the Select algorithm per la scelta di un elemento di pivot buona. La saggezza convenzionale sembra essere quella di dividere l'array in blocchi di 5 elementi, prendere la mediana di ciascuno, e quindi applicare ricorsivamente lo stesso approccio di blocco alle mediane risultanti per ottenere una "mediana delle mediane".Selezione mediana ottimale della mediana - 3 blocchi di elementi contro 5 blocchi di elementi?
Ciò che mi confonde è la scelta di blocchi a 5 elementi anziché di blocchi a 3 elementi. Con blocchi a 5 elementi, mi sembra che tu esegua le operazioni di mediana-of-5 n/4 = n/5 + n/25 + n/125 + n/625 + ...
, mentre con i blocchi a 3 elementi, esegui le operazioni di mediana-3 di n/2 = n/3 + n/9 + n/27 + n/81 + ...
. Essendo che ogni mediana-di-5 è di 6 confronti, e ogni mediana-di-3 è 2 confronti, che si traduce in confronti 3*n/2
utilizzando i confronti di mediana di 5 e n
utilizzando la mediana di 3.
Qualcuno può spiegare questa discrepanza e quale potrebbe essere la motivazione per l'utilizzo di blocchi a 5 elementi? Non ho familiarità con le consuete pratiche per l'applicazione di questi algoritmi, quindi forse c'è un modo per tagliare alcuni passaggi e ottenere ancora "abbastanza vicino" alla mediana per garantire un buon pivot, e tale approccio funziona meglio con i blocchi a 5 elementi ?
Questo lo risolve. Grazie! –
Solo curioso, puoi chiarire come da _ "T (n) ≤ T (n/5) + T (0.7n) + cn" _ segue _ "T (n) ≤ c * n * (1 + (9/10) + (9/10)^2 + ...) "_? Questa è l'unica parte che non trovo nell'articolo di Wikipedia e nel tuo articolo. Grazie! –
@Nikita: Un modo per vederlo è scriverlo come T (n) <= T (7n/10) + cn + cn/5 + cn/25 + .... Quindi scrivilo come T (n) < = cn + (7cn/10 + cn/5) + (49cn/100 + cn/25) + ... + <= cn + cn * 9/10 + cn * (9/10)^2 + ... –