Penso che la prima cosa da notare su questo problema è che, dato che ci sono voluti 4 minuti per ordinare i numeri, n
deve essere abbastanza grande. Ad esempio, ho appena usato quicksort per ordinare un miliardo di numeri sul mio computer, e ci sono voluti solo meno di 3 minuti. Quindi, n
è probabilmente circa 1 miliardo (da dare o prendere un ordine di grandezza).
Dato che n
è enorme, è probabile ragionevole approssimare questo runtime come c*n*lg(n)
per qualche costante c
, dal momento che i termini di ordine inferiore di espansione di esecuzione non dovrebbe essere troppo rilevanti per tale un grande n
. Se raddoppiamo n
, otteniamo la seguente moltiplicatore di runtime rispetto al runtime originale:
[Runtime(2n)]/[Runtime(n)]
[c * (2n) * lg(2n)]/[c * n * lg(n)]
2 * lg(2n)/lg(n)
2 * log_n(2n)
2 * (1 + log_n(2))
Qui, lg()
è il logaritmo in una base arbitraria e log_n()
è il logaritmo in base n
.
Innanzitutto, poiché abbiamo assunto n
è grande, un possibile modo di procedere sarebbe quello di approssimare log_n(2)
come 0, quindi il moltiplicatore runtime sarebbe approssimato come 2 e il runtime totale sarebbe approssimata come 8 minuti.
In alternativa, dal momento che probabilmente conosciamo n
entro un ordine di grandezza, un'altra possibilità sarebbe quella di approssimare il moltiplicatore per un valore probabile di n
:
- Se
n
= 100 milioni, allora avremmo approssimare il moltiplicatore come 2.075 e il tempo di esecuzione totale come 8.30 minuti.
- Se
n
= 1 miliardo, quindi approssimiamo il moltiplicatore come 2,067 e il tempo di esecuzione totale come 8,27 minuti.
- Se
n
= 10 miliardi, quindi approssimiamo il moltiplicatore come 2.060 e il tempo di esecuzione totale come 8.24 minuti.
Nota che enormi cambiamenti nella nostra approssimazione di n
producono cambiamenti piuttosto piccoli nell'approssimazione del runtime totale.
Vale la pena notare che, mentre questo è bello sulla carta, in pratica le considerazioni architettoniche possono far sì che i runtime della vita reale siano molto diversi da quelli che abbiamo calcolato qui. Ad esempio, se l'algoritmo induce un sacco di paging dopo aver raddoppiato la dimensione dei dati, il tempo di esecuzione potrebbe essere molto, molto più alto dei ~ 8 minuti che abbiamo approssimato qui.
In realtà quicksort è O (n^2) il nome è solo confuso – Pooya
@pseudoDust: la sua ipotesi potrebbe essere errata. se si guarda al problema ha assunto una cosa che può influenzare la sua soluzione – Pooya
@Pooya "Sono ** ** dato che un algoritmo Quicksort ha una complessità temporale O (nlog (n))" – pseudoDust