Considerare il seguente algoritmo di ricerca randomizzato su un array ordinato a
di lunghezza n
(in ordine crescente). x
può essere un qualsiasi elemento dell'array.complessità di un algoritmo di ricerca randomizzato
size_t randomized_search(value_t a[], size_t n, value_t x)
size_t l = 0;
size_t r = n - 1;
while (true) {
size_t j = rand_between(l, r);
if (a[j] == x) return j;
if (a[j] < x) l = j + 1;
if (a[j] > x) r = j - 1;
}
}
Qual è il valore di attesa della Big Theta complexity (delimitata sotto e sopra) di questa funzione quando x
è selezionato casualmente da a
?
Anche se questo sembra essere log(n)
, ho effettuato un esperimento con conteggio di istruzioni, e abbiamo scoperto che il risultato cresce un po 'più veloce di log(n)
(secondo i miei dati, anche (log(n))^1.1
meglio montare il risultato).
Qualcuno mi ha detto che questo algoritmo ha un esatto grande complessità theta (quindi ovviamente log(n)^1.1
non è la risposta). Quindi, potresti per favore dare la complessità del tempo insieme al tuo approccio per dimostrarlo? Grazie.
Update: i dati dal mio esperimento
log(n)
risultato in forma di Mathematica:
log(n)^1.1
risultato in forma:
Grazie per la risposta. Per favore, dammi parecchi minuti per capirlo. Per quanto riguarda la curva, ho intenzionalmente iniziato a 1000, sperando che le costanti non influiscano molto. – 4ae1e1
@KevinSayHi Inizia ancora più in alto? Per esperienza, è davvero abbastanza difficile distinguere empiricamente tra x e x^1.1. È possibile trovare il tempo medio di esecuzione sul log n e osservare il limite più edificante. –
Il tuo ragionamento è molto convincente, ma scusa mi sono bloccato alla riga 3 del calcolo. Abbiamo '2/n sum_ {i = 1}^n H (i) - 1', ma come possiamo passare alla quarta riga? Non sono abbastanza esperto in matematica discreta, mi dispiace. – 4ae1e1