n * log n e n / log n rispetto al tempo di esecuzione polinomiale


14

Comprendo che è più veloce di Θ ( n log n ) e più lento di Θ ( n / log n ) . Ciò che è difficile per me capire è come confrontare effettivamente Θ ( n log n ) e Θ ( n / log n ) con Θ ( n f ) dove 0 < f < 1 .Θ(n)Θ(nlogn)Θ(n/logn)Θ(nlogn)Θ(n/logn)Θ(nf)0<f<1

Per esempio, come facciamo a decidere vs. Θ ( n 2 / 3 ) o Θ ( n 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

Vorrei avere alcune indicazioni per procedere in questi casi. Grazie.

Risposte:


3

Se disegni solo un paio di grafici, sarai in buona forma. Wolfram Alpha è una grande risorsa per questo tipo di indagini:

equazioni

Grafico

Generato da questo link . Si noti che nel grafico, log (x) è il logaritmo naturale, motivo per cui l'equazione di un grafico sembra un po 'divertente.



Oltre ad essere d'accordo con Raphael, questa immagine darebbe un'idea molto migliore , scegliere una gamma ancora più ampia fa scomparire la seconda funzione che può essere fonte di confusione.
phant0m

9

è l'inverso di 2 n . Proprio come 2 n cresce più velocemente di qualsiasi polinomio n k indipendentemente da quanto grande un finita k è, registro n crescerà più lentamente rispetto a qualsiasi funzioni polinomiali n k indipendentemente da un diverso da zero quanto piccolo, positivo k è.logn2n2nnkklognnkk

vs n k , per k < 1 è identico a: n / log n vs n / n 1 - kn/lognnkk<1n/lognn/n1k

come per grandi n , n / log n > n k per k < 1 e ampio n .n1k>lognnn/logn>nkk<1n


3

Per molti algoritmi, a volte capita che le costanti siano diverse, causando l'una o l'altra è più veloce o più lenta per dimensioni di dati inferiori e non sono altrettanto ordinate per complessità algoritmica.

Detto questo, se consideriamo solo le dimensioni dei dati super-grandi , vale a dire. quale alla fine vince, quindi O(n^f)è più veloce di O(n/log n)per 0 < f < 1.

Gran parte della complessità algoritmica consiste nel determinare quale algoritmo è eventualmente più veloce, quindi è spesso sufficiente sapere che O(n^f)è più veloce di O(n/log n)per 0 < f < 1.

Una regola generale è che la moltiplicazione (o divisione) per log nsarà alla fine trascurabile rispetto alla moltiplicazione (o divisione) n^fper qualsiasi f > 0.

Per dimostrarlo più chiaramente, consideriamo cosa succede quando n aumenta.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Notate quale diminuisce più rapidamente? È la n^fcolonna.

Anche se ffosse più vicino a 1, la n^fcolonna inizierà solo più lentamente, ma siccome raddoppia, il tasso di cambiamento del denominatore accelera, mentre il denominatore della n/log ncolonna sembra cambiare a un ritmo costante.

Tracciamo un caso particolare su un grafico

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Fonte: Wolfram Alpha

Ho selezionato O(n^k)tale che kè abbastanza vicino a 1 (at 0.9). Ho anche selezionato le costanti in modo che inizialmente O(n^k)sia più lento. Tuttavia, si noti che alla fine "vince" alla fine e richiede meno tempo di O(n/log n).


che dire di n / log n

Era un po 'un errore di battitura, questo è ciò che intendevo all'inizio. Comunque, ho aggiunto un grafico più appropriato che mostra che n^kalla fine è più veloce, anche se le costanti sono selezionate in modo tale che inizialmente sia più lento.

3

nfnn1fn2/3=n/n1/3

nlognvs.nn1f.

lognnεε>0


1

Quando si confrontano i tempi di esecuzione, è sempre utile confrontarli utilizzando grandi valori di n. Per me, questo aiuta a costruire l'intuizione su quale funzione è più lenta

Nel tuo caso pensa a n = 10 ^ 10 e a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Quindi, O (n ^ a) è più veloce di O (n / logn), quando 0 <a <1 ho usato solo un valore, tuttavia, puoi usare più valori per creare intuizione sulla funzione


1
Non scrivere O(10^9), ma il punto principale sul provare alcuni numeri per costruire l'intuizione è giusto.

Fallire. Questo non è corretto Hai sostituito una singola n costante, che può essere distorta. Se avessi scelto costanti diverse, avrei potuto rendere migliore qualsiasi algoritmo. La notazione O grande viene utilizzata per stabilire le tendenze in ciò che sarà più veloce a lungo termine. Per fare questo, devi essere in grado di dimostrare che è più veloce per n grandi, anche se è più lento quando n è più piccolo.

Grazie. Aggiunti più valori e parte per considerare numeri più grandi

Va notato che solo perché f (a)> g (a) per qualche costante a, non implica necessariamente che O (f (x))> O (g (x)). Questo è utile per costruire l'intuizione, ma non è sufficiente per comporre una prova rigorosa. Per dimostrare che questa relazione è valida, devi mostrare che ciò è vero per TUTTI i n grandi, non solo per uno grande n. Allo stesso modo, devi dimostrare che è vero per tutti i polinomi di grado positivo <1.

1

fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

(2,10)<(3,5)(2,10)>(2,5)

Applicato al tuo esempio:

O(n/logn)(1,1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

Potresti dire: i poteri di n dominano i poteri del registro, che dominano i poteri del registro.

Fonte: Concrete Mathematics, p. 441

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.