2 ^ n e n * 2 ^ n hanno la stessa complessità temporale?


178

Le risorse che ho trovato sulla complessità temporale non sono chiare su quando sia giusto ignorare i termini in un'equazione della complessità temporale, in particolare con esempi non polinomiali.

Mi è chiaro che dato qualcosa del modulo n 2 + n + 1, gli ultimi due termini sono insignificanti.

In particolare, date due categorizzazioni, 2 n e n * (2 n ), il secondo è nello stesso ordine del primo? La moltiplicazione n aggiuntiva è importante? Di solito le risorse dicono solo x n è in modo esponenziale e cresce molto più velocemente ... quindi continua.

Posso capire perché non lo farebbe poiché 2 n supererà notevolmente n, ma poiché non vengono sommati insieme, importerebbe molto quando si confrontano le due equazioni, infatti la differenza tra loro sarà sempre un fattore di n, che sembra importante per non dire altro.


8
Secondo me, dato che NLogN è considerato strettamente più lento di N, ma alla maggior parte delle persone non importa davvero di quanto, è sicuro dire che N2 ^ N è semplicemente più lento di 2 ^ N, ma non "abbastanza più lento" per le persone a cura ..
Jack,

@tobias_k, capisco questo punto, ma considero l'esempio di O (n!). Un altro termine sarebbe davvero diverso? O (n!) Sta a O (n * n!) Come O (n!) Sta a O ((n + 1)!), Ovvero lo stesso grafico è semplicemente spostato. La crescita è la stessa però ... In questo caso, anche se uno è strettamente grande, la crescita è diversa? non è questo il problema della complessità del tempo?
matty-d,

3
@JackWu, ma alla maggior parte delle persone non importa davvero fino a quando non dovrai ordinare centinaia di milioni di dischi con nlogn invece di n :)
CB

4
In effetti, n! = o((n+1)!)cioè, cresce asintoticamente rigorosamente più lentamente.
Chepner,

16
Si noti che questo non ha nulla a che fare con la teoria della complessità, si tratta "solo" di aptottici. Inoltre, questo tipo di domande è probabilmente meglio su Informatica .
Raffaello,

Risposte:


231

Dovrai andare alla definizione formale della grande O ( O) per rispondere a questa domanda.

La definizione f(x)appartiene a O(g(x))se e solo se esiste il limite , ovvero non è l'infinito. In breve, ciò significa che esiste una costante , tale che il valore di non è mai maggiore di .limsupx → ∞ (f(x)/g(x))Mf(x)/g(x)M

Nel caso della tua domanda let and let . Allora è che crescerà ancora all'infinito. Pertanto non appartiene a .f(n) = n ⋅ 2ng(n) = 2nf(n)/g(n)nf(n)O(g(n))


5
Per una definizione leggermente più semplice da leggere, vedi qui
Alden,

3
Formalmente parlando, non puoi prendere il limite di O(f(x)/g(x)); La notifica big-O è una scorciatoia per un insieme di funzioni, non una singola funzione di cui puoi limitare il valore. Tuttavia, penso sia vero che puoi dimostrarlo f(x) = O(g(x))se lim(x->infinity) f(x)/g(x)esiste.
Chepner,

44
Il limite non deve esistere; il rapporto deve essere limitato solo da una costante per x sufficientemente grande. Ad esempio, 2 + sin (x) è in O (1), ma (2 + sin (x)) / 1 non si avvicina a un limite come x-> infinito.
user2357112 supporta Monica il

2
La definizione sarebbe corretta con lim supanziché lim.
David Eisenstat,

11
@IvayloStrandjev, tieni presente che la tua breve descrizione non è corretta. Questo deve essere vero per un valore sufficientemente grande x, non per tutti i valori di x.
K.Steff,

85

Un modo rapido per vedere che n⋅2ⁿè più grande è fare un cambiamento di variabile. Let m = 2ⁿ. Quindi n⋅2ⁿ = ( log₂m )⋅m(prendendo il logaritmo in base 2 su entrambi i lati di m = 2ⁿn = log₂m), e puoi facilmente mostrare che m log₂mcresce più velocemente di m.


3
Grazie! Questa è la migliore risposta secondo me. Le prove basate su definizioni formali sono corrette, ma se hai un ostacolo di qualche tipo da superare, un'analogia molto comoda e familiare farà il lavoro il migliore e il più veloce.
John P,

1
Domanda stupida, che cos'è lg? Logaritmo in base 2?
Pierre Arlaud,

3
È un'abbreviazione pigra. In informatica, tende a significare base 2 perché deriva principalmente da strategie di divisione e conquista. Nella notazione big-O, potrebbe rappresentare qualsiasi cosa, perché il logaritmo base-x di un numero differisce dal suo logaritmo base-y solo per un fattore costante, indipendentemente da xey.
Chepner,

3
Dovrei notare a posteriori che lgè la notazione ISO per un logaritmo in base 10, piuttosto che l'uso agnostico di base più comunemente usato quando si parla di tempi di esecuzione asintotici. Vedi en.wikipedia.org/wiki/Logarithm#Particular_bases
chepner

Ok, certo, ma non capisco perché sia ​​più ovvio che m log m cresce più velocemente di m, quindi n 2 ^ n cresce più velocemente di 2 ^ n.
Djechlin,

10

Sono d'accordo che n⋅2ⁿnon è inO(2ⁿ) , ma ho pensato che dovrebbe essere più esplicito poiché il limite di utilizzo superiore non sempre vale.

Dalla definizione formale di Big-O: f(n)è O(g(n))se esistono costanti c > 0e n₀ ≥ 0tali che per tutto ciò n ≥ n₀che abbiamo f(n) ≤ c⋅g(n). Si può facilmente dimostrare che non esistono tali costanti per f(n) = n⋅2ⁿe g(n) = 2ⁿ. Tuttavia, si può dimostrare che g(n)è inO(f(n)) .

In altre parole, n⋅2ⁿè limitato da 2ⁿ. Questo è intuitivo. Sebbene siano entrambi esponenziali e quindi è altrettanto improbabile che vengano utilizzati nella maggior parte delle circostanze pratiche, non possiamo dire che siano dello stesso ordine perché 2ⁿnecessariamente crescono più lentamente di n⋅2ⁿ.


f(n) = 2*2^nPenso che volevi dire n*2^n?
tobias_k,

4

Non discuto con altre risposte che affermano che n⋅2ⁿcresce più velocemente di 2ⁿ. Ma n⋅2ⁿcresce è ancora solo esponenziale.

Quando parliamo di algoritmi, spesso diciamo che la complessità del tempo aumenta è esponenziale. Quindi, che consideriamo 2ⁿ, 3ⁿ, eⁿ, 2.000001ⁿ, o la nostra n⋅2ⁿdi essere allo stesso gruppo di complessità esponenziale cresce.

Per dargli un po 'di senso matematico, consideriamo una funzione f(x)crescere (non più velocemente di) esponenzialmente se esiste una tale costante c > 1, chef(x) = O(cx) .

Poiché n⋅2ⁿla costante cpuò essere qualsiasi numero maggiore di 2, prendiamo3 . Poi:

n⋅2ⁿ / 3ⁿ = n ⋅ (2/3)ⁿe questo è inferiore a 1qualsiasi altro n.

Quindi 2ⁿcresce più lentamente di n⋅2ⁿ, l'ultimo a sua volta cresce più lentamente di 2.000001ⁿ. Ma tutti e tre crescono in modo esponenziale.


Nell'ultimo esempio, n * 2 ^ n è maggiore di 2.000001 ^ n fino a n = 34.726.000. A quel punto 2 ^ n è un numero con più di 10 milioni di cifre, quindi non importa ...
gnasher729

1
@ gnasher729 È solo una costante che possiamo omettere poiché f (n) ec * f (n) ha la stessa complessità in termini di big-O. ad es. 40'000'000 * 2.000001 ^ n è maggiore di n * 2 ^ n immediatamente. Ma hai ragione, non importa davvero, direi che non importa quando colpiamo le crescite esponenziali (a meno che non otteniamo solo piccoli valori di n).
Andrey,

2

Hai chiesto "è il secondo nello stesso ordine del primo? La n moltiplicazione aggiuntiva conta?" Queste sono due domande diverse con due risposte diverse.

n 2 ^ n cresce asintoticamente più velocemente di 2 ^ n. Questa è la risposta a questa domanda.

Ma potresti chiedere "se l'algoritmo A richiede 2 ^ n nanosecondi e l'algoritmo B prende n 2 ^ n nanosecondi, qual è la più grande n dove posso trovare una soluzione in un secondo / minuto / ora / giorno / mese / mese? E le risposte sono n = 29/35/41/46/51/54 contro 25/30/36/40/45/49. Non molta differenza nella pratica.

La dimensione del problema più grande che può essere risolto nel tempo T è O (ln T) in entrambi i casi.

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.