Esistono variazioni dei normali runtime della Big-O-Notation?


9

Esistono più O -Notations, come O(n) o O(n2) e così via. Mi chiedevo se ci sono variazioni di quelli nella realtà come O(2n2) o O(logn2) , o se quelli sono matematicamente errati.

O sarebbe giusto dire che è possibile migliorare una O(5n2) a una O(3n2) ? Non riesco e non ho ancora bisogno di capire i tempi di esecuzione e non ho bisogno di migliorare nulla, ma avrei bisogno di sapere se in questo modo descrivi le tue funzioni nella realtà.


1
Non vi è alcuna differenza materiale tra O (5n ^ 2) e O (3n ^ 2) durante un'analisi asintotica. Sono entrambi O (n ^ 2) e differiscono solo per una costante. In effetti, in una prova, potresti persino ridurre O (5n ^ 2) a O (3n ^ 2) o O (n ^ 2) per rendere la matematica più pulita poiché equivalenti. Quando scrivi la tua prova, annoti in una barra laterale che sono equivalenti. In effetti, potresti persino scambiare una O (log n) con O (n) e notare che O (log n) <= O (n) nella barra laterale. La nota nella barra laterale indica al lettore che è intenzionale e non un errore di battitura. (Almeno è così che ho fatto quando ho preso Algorithm Analysis al college).
1919

2
Se stai usando la notazione per sbarazzarti di piccoli fattori, puoi sempre scrivere qualcosa del tipo "... migliora il tempo di esecuzione da 5 n 2 + o ( n 2 ) fino a 3 n 2 + o ( n 2 ) ", ecc. O, equivalentemente, ( 5 + o ( 1 ) ) n 2 e ( 3 + o ( 1 ) ) n 2O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n2. Alcuni autori preferiscono scrivere semplicemente come abbreviazione per l'ex. Vedi, ad esempio, il libro di testo di Trefethen e Bau. 5n2
Yonatan N,

Risposte:


21

Mi chiedevo se ci sono variazioni di quelli nella realtà come O(2n2) o O(log(n2)) , o se quelli sono matematicamente errati.

Sì, O(2n2) o O(log(n2)) sono variazioni valide.

Tuttavia, li vedrai raramente se li vedessi affatto, specialmente nei risultati finali. Il motivo è che O(2n2) è O(n2) . Allo stesso modo, O(log(n2)) è O(logn) . Potrebbe essere sorprendente per i principianti. Tuttavia, queste uguaglianze sono più o meno la vera ragione per cui sono state introdotte grandi annotazioni O , per nascondere un fattore costante moltiplicativo che è spesso difficile da definire e relativamente insignificante.

Sarebbe una cosa giusta dire che è possibile migliorare una O(5n2) a una O(3n2) ?

Non è affatto un miglioramento se la complessità temporale di un algoritmo viene cambiata da O(5n2) a O(3n2) o da Ω(5n2) a Ω(3n2) , perché O(5n2) è O(3n2) mentre Ω(5n2) è Ω(3n2) . Quindi non è corretto affermare che la complessità temporale è migliorata daO(5n2) aO(3n2) . È corretto affermare che la complessità temporale di un algoritmo è migliorata da5n2 a3n2 , ovviamente.


Esercizio 1. Mostra che O(5n2)=O(3n2)=O(n2) .

Esercizio 2. Mostra che O(logn)=O(log(n2)) .

Esercizio 3. Mostra che Ω(n2+n)=Ω(n2) .


1
@bv_Martn Ecco un buon link per capire come viene definita la notazione (solo un semplice calcolo del limite!): math.stackexchange.com/questions/925053/…O(n)
Akshat Mahajan

2
L'unica volta che ho visto fattori costanti nella notazione big-O è quando qualcuno vuole sottolineare che, sebbene due algoritmi appartengano alla stessa classe di complessità, uno di questi è strettamente più veloce dell'altro.
Segna

7
@AkshatMahajan L'unica risposta a questa domanda /math/925053 è chiaramente sbagliata. Esistono molte fonti affidabili su grandi annotazioni O
John L.

1
"È corretto affermare che la complessità temporale di un algoritmo è migliorata da 5n ^ 2 a 3n ^ 2" - sebbene il tempo di esecuzione esatto spesso vari a seconda delle dimensioni e dei valori di input. Inoltre, ciò comporta la ponderazione di tutte le operazioni / la concentrazione su un'operazione, che potrebbe non dire molto sui fattori costanti che otterrai nel mondo reale o essere paragonabile ad altri algoritmi che utilizzano pesi diversi. Quindi, sebbene possa avere alcuni casi d'uso validi, dire qualcosa di simile sopra è di utilità limitata (che è probabilmente il motivo per cui è visto raramente).
Dukeling,

1
@Mark: è semplicemente sbagliato.
user21820

13

Sei sempre libero di non usare affatto questa notazione. Cioè, puoi determinare una funzione f(n) nel modo più preciso possibile, quindi provare a migliorarla. Ad esempio, potresti avere un algoritmo di ordinamento che esegue confronti f(n) , quindi potresti provare a trovare un altro algoritmo di ordinamento che esegue solo confronti g(n) . Naturalmente, tutti i tipi di funzioni f(n) esistono (in teoria) e possono anche emergere (in pratica).

Invece di considerare la notazione Big Oh come una magia misteriosa in cui devi consultare i maghi per chiederti se puoi fare qualcosa, dovresti guardare alla sua definizione . Rispetta la definizione, quindi fai tutto il necessario per svolgere il tuo lavoro.


Beh, non ho ancora bisogno in pratica. O in teoria in realtà, ho solo bisogno di sapere se le definizioni fornite da Wikipedia O (1) -O (n!) Sono le uniche che esistono, o se in realtà potresti descriverle in modo diverso se sono diverse, come O (7N). La mia paura è che se uso un professore di matematica perderà le ali
bv_Martn

1
Qualsiasi definizione fatta da chiunque esiste. Dovresti leggere attentamente cosa significa la notazione o O ( n ! ) Perché la tua domanda non ha senso. Non ci sono scorciatoie. Se vuoi capire cosa significa un pezzo di contenuto matematico, devi essere disposto a investire del tempo. O(1)O(n!)
Juho

6
@bv_Martn Il professore di matematica ha molte più probabilità di sfuggire perché stai visualizzando un elenco di esempi come un elenco di definizioni. Gran parte del punto della matematica è definire le cose in un modo che le faccia funzionare in generale, non solo in casi specifici. La tua domanda è fondamentalmente una versione più avanzata di "Wikipedia dice che posso aggiungere uno e aggiungere due e aggiungere diciassette. Ma posso aggiungere anche altri numeri?"
David Richerby,

7

Mentre la risposta accettata è abbastanza buona, non tocca ancora il vero motivo per cui O(n)=O(2n) .

La notazione Big-O descrive la scalabilità

Alla base, Big-O Notation non è una descrizione di quanto tempo impiega un algoritmo a funzionare. Né è una descrizione di quanti passaggi, righe di codice o confronti fa un algoritmo. È molto utile quando usato per descrivere come un algoritmo si ridimensiona con il numero di input.

Prendi una ricerca binaria, per esempio. Dato un elenco ordinato, come trovi un valore arbitrario al suo interno? Bene, potresti iniziare da metà. Dal momento che l'elenco è ordinato, il valore medio ti dirà in quale metà dell'elenco si trova il tuo valore target. Quindi l'elenco che devi cercare è ora diviso a metà. Questo può essere applicato in modo ricorsivo, quindi andando al centro del nuovo elenco e così via fino a quando la dimensione dell'elenco è 1 e non hai trovato il tuo valore (o non esiste nell'elenco). Raddoppiare la dimensione dell'elenco aggiunge solo un ulteriore passaggio all'algoritmo, che è una relazione logaritmica. Quindi questo algoritmo è O(logn). Il logaritmo è di base 2, ma non importa: il nocciolo della relazione è che la moltiplicazione dell'elenco per un valore costante aggiunge solo un valore costante al tempo.

Contrastare una ricerca standard attraverso un elenco non ordinato - l'unico modo per cercare un valore in questo caso è quello di controllare ognuno. Lo scenario peggiore (che è ciò che Big-O implica specificamente) è che il tuo valore è proprio alla fine, il che significa che per un elenco di dimensioni n , devi controllare n valori. Raddoppiare la dimensione dell'elenco raddoppia il numero di volte che è necessario verificare, che è una relazione lineare. O(n) . Ma anche se si dovessero eseguire due operazioni su ciascun valore, alcune elaborazioni, ad esempio, la relazione lineare è ancora valida. O(2n) semplicemente non è utile come descrittore, poiché descriverebbe esattamente la stessa scalabilità di O(n) .

Apprezzo che molte di queste risposte ti stiano sostanzialmente dicendo di arrivare a questa conclusione da solo leggendo la definizione di Big-O. Ma questa comprensione intuitiva mi ha preso un po 'di tempo per avvolgere la mia testa e così te la spiego nel modo più chiaro possibile.


5
Il problema più grande con questo tipo di risposta è che non tocca la definizione di Big Oh, ma lo usa solo come una sorta di magia intuitiva come in "vedi quando fai questo e questo, è ". Personalmente, penso che sia molto più istruttivo dire a qualcuno che Big Oh non ha assolutamente nulla a che fare con gli algoritmi necessariamente e iniziare con quello. O(n)
Juho

3
@Juho Istruttivo, forse, ma alla fine inutile per la stragrande maggioranza degli informatici.
disperde

4
Con questo devo essere in disaccordo. Etichettarsi come uno scienziato informatico non dovrebbe essere una scusa per non capire cosa significhi una notazione che si usa, vale a dire, saltare tutta la matematica.
Juho

3
Si. Non ho alcuna obiezione a programmatori non capire queste cose, ma se si desidera chiamare te stesso un computer scientist , allora questo è materiale di base.
David Richerby,

2
@dkaeae No, mi riferisco a persone che lavorano in altre carriere nel settore, come gli sviluppatori di software.
disperde

5

Puoi scrivere O(f) per qualsiasi funzione f ed ha perfettamente senso. Come da definizione, g(n)=O(f(n)) se esiste una costante  c tale che g(n)cf(n) per tutti abbastanza grandi n . Nulla in quella definizione dice chef deve essere una sorta di "bella" funzione.

Ma, come hanno indicato altre risposte, g(n)=O(f(n)) e g(n)=O(2f(n)) descrivono esattamente la stessa situazione: se g(n)cf(n) per tuttin abbastanza grandi , quindi abbiamo ancheg(n)c22f(n), quindig(n)=O(2f(n)), anche (prendendo la costante comec/2).

Come problema secondario, non scrivere " logn2 ", perché non è chiaro al 100% cosa significhi. Si potrebbe dire che ovviamente significa log(n2) ma quasi tutti lo scriverebbero come 2logn , quindi mette in dubbio il lettore.

Inoltre, nota che la notazione big- O non ha nulla a che fare con i tempi di autonomia di per sé . È solo una notazione per le relazioni tra le funzioni. Queste funzioni sono spesso utilizzate per misurare i tempi di esecuzione degli algoritmi, ma questa è solo un'applicazione, proprio come misurare l'altezza delle persone è solo un'applicazione di numeri.


4

Guarda la definizione di O (f (n)) e vedi che ad esempio O (2n ^ 2) e O (n ^ 2) sono esattamente gli stessi. Cambiare un algoritmo da 5n ^ 2 a 3n ^ 2 è un miglioramento del 40 percento. Cambiare da O (5n ^ 2) a O (3n ^ 2) non è in realtà alcun cambiamento, sono gli stessi.

Ancora una volta, leggi la definizione di O (f (n)).


4

O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

=

O(n)=O(2n) Or that constant factors don't matter when defining the Big O.


4
The equality convention isn't really about typing. It's because the usefulness of expressions such as log(n!)=nlognn+O(logn) encourages us to view O(f) as both "the set of functions such that [...]" and "some function such that [...]"
David Richerby
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.