Quello che segue è ottimale legato:
Se p = < n/log n si può fare a O (n/p) di tempo; altrimenti è O (log n) vale a dire quando p> n/log n non guadagni nulla rispetto a p = n/log n.
Proof - limite inferiore:
rivendicazione 1: Non si può mai fare più veloce di Ω (n/p), in quanto i processori p può dare solo aumento di velocità di p
rivendicazione 2: Non si può mai fare più veloce di Ω (log n), a causa del modello di CREW (vedere la carta di non perdonata); se si desidera verificare se un array 0-1 ha almeno un 1, è necessario O (log n) tempo.
Proof - limite superiore:
rivendicazione 3: È possibile trovare il massimo utilizzando n/log n processori e in O (log n)
Dimostrazione: E 'facile trovare la massima utilizzando i processori n e log n time; ma in effetti, in questo algoritmo la maggior parte dei processori è inattivo per la maggior parte del tempo; mediante un adeguato incastro a coda di rondine, (vedi ad esempio il libro sulla complessità di Papadimitriou) il loro numero può essere ridotto a n/log n.
Ora, dato inferiore a n/log n processori si possono dare lavoro assegnato a K processori a 1 processore, questo divide requisito processore da K e si moltiplica il tempo richiesto da K.
Sia K = (n/log n)/p; l'algoritmo precedente viene eseguito nel tempo O (K log n) = O (n/p) e richiede n/(log n * K) = p processori.
Modificato: Ho appena realizzato che quando p < = n/log n, l'algoritmo di dasblinkenlight ha lo stesso tempo di esecuzione asintotico:
n/p log + p < = n/p + log (n/log n) < = n/p + log n < = n/p + n/p < = 2n/p = O (n/p)
in modo da poter usare tale algoritmo, che ha complessità O (n/p) quando p < = n/log n e O (log n) altrimenti.
Che cosa significa "più veloce" qui? Non dipenderebbe dai costi relativi dell'esecuzione del codice, della memoria di lettura, della memoria di scrittura, del confronto dei numeri e anche di come funziona la cache? –
@aix: potresti avere ragione. Non mi importa se qualcuno lo segnala per una mossa lì. Fino ad allora, lo lascerò stare qui. Si tratta ancora di programmazione, dopo tutto. – ArjunShankar
@PaulHankin: sto parlando di complessità qui. Rilasciamo tutte le costanti come "5ms" da leggere, "10ns" un ciclo, riscontri cache, ecc. Prendi solo in considerazione cose come "leggi", "scrivi", "confronta" come 1 operazione: http: //en.wikipedia.org/wiki/Analysis_of_algorithms – ArjunShankar