La notazione Big Oh non menziona il valore costante


13

Sono un programmatore e ho appena iniziato a leggere Algorithms. Non sono del tutto convinto delle annotazioni cioè Bog Oh, Big Omega e Big Theta. Il motivo è per definizione di Big Oh, afferma che dovrebbe esserci una funzione g (x) tale che sia sempre maggiore o uguale a f (x). O f (x) <= cn per tutti i valori di n> n0.

Perché non menzioniamo il valore costante nella definizione? Ad esempio, diciamo una funzione 6n + 4, la denotiamo come O (n). Ma non è vero che la definizione valga per tutto il valore costante. Questo vale solo quando c> = 10 e n> = 1. Per valori inferiori di c di 6, il valore di n0 aumenta. Quindi perché non menzioniamo il valore costante come parte della definizione?


4
Come proponi di rappresentare esattamente il valore costante?
Daniel B,

1
Facendo un ulteriore passo avanti, qualsiasi funzione di terminazione è O (1) se si associa n.
Brian,

Risposte:


23

Ci sono diverse ragioni, ma probabilmente la più importante è che le costanti sono una funzione dell'implementazione dell'algoritmo, non dell'algoritmo stesso. L'ordine di un algoritmo è utile per confrontare gli algoritmi indipendentemente dalla loro implementazione.

Il runtime effettivo di un quicksort generalmente cambia se è implementato in C o Python o Scala o Postscript. Lo stesso vale per l' ordinamento a bolle : il tempo di esecuzione varia notevolmente in base all'implementazione.

Tuttavia, ciò che non cambierà è il fatto che, a parità di altre condizioni, man mano che il set di dati aumenta, il tempo richiesto per eseguire un ordinamento a bolle aumenterà più rapidamente del tempo richiesto per eseguire quicksort nel caso tipico, indipendentemente dalla lingua o dalla macchina sono implementati con, assumendo un'implementazione ragionevolmente corretta. Questo semplice fatto consente di fare inferenze intelligenti sugli algoritmi stessi quando non sono disponibili dettagli concreti.

L' ordine di un algoritmo filtra i fattori che, sebbene importanti nelle misurazioni del mondo reale, tendono ad essere solo rumore quando si confrontano gli algoritmi in astratto.


22

O (n) e altre notazioni di ordine (in genere) non riguardano il comportamento di funzioni per valori piccoli. Riguarda il comportamento delle funzioni per valori molto grandi, vale a dire i limiti mentre n si sposta verso l'infinito.

Le costanti sono tecnicamente importanti, ma sono in genere astratte via quando una volta n diventa abbastanza grande, il valore di c è del tutto irrilevante. Se il valore di c è importante, possiamo includerlo nell'analisi, ma a meno che le funzioni confrontate non abbiano fattori costanti molto grandi o se l'efficienza sia una preoccupazione particolarmente importante, in genere non lo sono.


3
Ad esempio, la costruzione delle piramidi è O (n), l'ordinamento delle immagini è O (n log n) - ad un certo punto potresti avere abbastanza piramidi da impiegare più tempo a ordinare le immagini che a costruirne una nuova! Ma solo per un numero molto elevato di piramidi!
Martin Beckett,

Buona risposta, ma per un dato N e due algoritmi che rientrano tipicamente nella stessa "famiglia" di complessità, può esserci il merito di fare esattamente ciò che suggerisce l'OP e di includere almeno i coefficienti relativi. Un algoritmo lineare con il doppio del numero di istruzioni per elemento come un altro potrebbe essere definito * O * (2N) al secondo * al * di * alg per mostrare la differenza relativa, perché per qualsiasi N, il primo algoritmo sarà sempre doppio il tempo di esecuzione del secondo; tuttavia, quando si confronta con una funzione di una diversa famiglia di complessità, come * O * (NlogN), i coefficienti non contano.
KeithS

10

La notazione Big O come da definizione afferma che: La notazione Big O si basa sull'intuizione che per tutti i valori n at e a destra di n ', il valore di f (n) è su o sotto cg (n). Le costanti inoltre non contano quando si passa a fattori (variabili) di alto valore (come n-quadrato o n-cubo) poiché sono solo le costanti e non le quantità variabili che possono diventare grandi come quei fattori. Di seguito è riportato il grafico della notazione Big-O.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




inserisci qui la descrizione dell'immagine

L'essenza di questa notazione sta nel fatto " how lower is f(n) from c.g(n) and not when it starts becoming lower".


In quel caso per ogni O (n) è anche Big theta di n poiché come da definizione per alcune costanti sarà un limite inferiore e per alcune costanti è un limite superiore. per esempio 6n + 4 è anche un grande theta (n) poiché quando c è minore di 10 è sempre il limite inferiore. e quando c è maggiore di 10 è un limite superiore. Quindi possiamo dire che per ogni notazione Big Oh è anche un grande theta?
Pradeep,

1
Lo stai dicendo al contrario: "Big Theta significa Big Oh". E Big -Oh può essere sostituito con Big-Theta per limiti asintoticamente stretti.
Vaibhav Agarwal,

9

Nell'analisi dell'algoritmo, l' Ordine della crescita è l'astrazione chiave e fornisce la velocità con cui il tempo di esecuzione cambia al variare delle dimensioni dell'input. Supponiamo che un algoritmo abbia un tempo di esecuzione f(n) = 2n + 3. Ora inseriamo alcune dimensioni di input,

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

Come si può vedere, l'ordine di crescita è determinato principalmente dalla variabile n; le costanti 2 e 3 sono meno significative e con l'aumentare della dimensione dell'input diventano ancora meno significative nel determinarla. Questo è il motivo per cui nell'analisi dell'algoritmo le costanti sono ridotte a favore della variabile che determina l'ordine di crescita di una funzione.


1

L'intera nozione della notazione Big-Oh è specificamente quella di ignorare le costanti e presentare la parte più importante della funzione che descrive il tempo di esecuzione di un algoritmo.

Dimentica la definizione formale per un momento. Qual è la funzione peggiore (in più rapida crescita) n^2 - 5000o 5000 n + 60000? Per nmeno di circa 5000, la funzione lineare è maggiore (e quindi peggiore). Oltre a ciò (valore esatto 5013?), L'equazione quadratica è più grande.

Dato che ci sono più numeri (qualche numero in più) positivi maggiori di 5000 rispetto a meno, consideriamo il quadratico come la funzione "più grande" (peggiore) in generale. La notazione dell'ordine (Big-Oh ecc.) Impone che (è sempre possibile eliminare un additivo e una costante moltiplicativa usando tali definizioni).

Certo, le cose non sono sempre semplici. A volte si fa vuole sapere queste costanti. Qual è il miglior ordinamento per inserzione o ordinamento a bolle? Entrambi lo sono O(n^2). Ma uno è davvero meglio dell'altro. Con un'analisi più elaborata si possono ottenere costanti come ti stai chiedendo. Di solito è molto più semplice calcolare la funzione Big-Oh che una funzione più esatta.

Big-Oh ignora queste costanti per semplificare e facilitare i confronti più importanti. Ci piace la notazione perché di solito non vogliamo conoscere le costanti (per lo più irrilevanti).


1

(poiché questa è una risposta più lunga, leggi i grassetti per un riepilogo )

Facciamo il tuo esempio e lo esaminiamo passo dopo passo, comprendendo lo scopo dietro ciò che stiamo facendo. Iniziamo con la tua funzione e l'obiettivo di trovare la sua notazione Big Oh:

f(n) = 6n+4

In primo luogo, lasciare che O(g(n))sia il Big Oh notazione che stiamo cercando di trovare per f(n). Dalla definizione di Big Oh, dobbiamo trovare un semplificato in g(n) cui esistono alcune costanti ce n0dove c*g(n) >= f(n)è vero per tutto ciò che nè maggiore di n0.

Innanzitutto, scegliamo g(n) = 6n + 4(che cederebbe O(6n+4)in Big Oh). In questo caso vediamo che c = 1e qualsiasi valore di n0soddisferà i requisiti matematici dalla nostra definizione di Big Oh, poiché è g(n)sempre uguale a f(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

A questo punto abbiamo soddisfatto i requisiti matematici. Se ci fermassimo aO(6n+4) , è chiaro che questo non è più utile della scrittura f(n), quindi mancherebbe il vero scopo della notazione Big Oh: capire la complessità temporale generale di un algoritmo! Passiamo quindi al passaggio successivo: la semplificazione.

Innanzitutto, possiamo semplificare 6ncosì come è il Big Oh O(4)? No! (Esercizio per il lettore se non capiscono perché)

In secondo luogo, possiamo semplificare il 4modo in cui il Big Oh lo è O(6n)? Sì! In tal caso g(n) = 6n, quindi:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

A questo punto, scegliamo c = 2da allora il lato sinistro aumenterà più velocemente (di 12) rispetto al lato destro (di 6) per ogni incremento di n.

2*6n      >=  6n + 4

Ora dobbiamo trovare un positivo in n0cui l'equazione sopra è vera per tutti ni valori superiori a quel valore. Dato che sappiamo già che il lato sinistro sta aumentando più rapidamente di quello destro, tutto ciò che dobbiamo fare è trovare una soluzione positiva. Quindi, poiché n0 = 2ciò che è vero è vero, lo sappiamo g(n)=6n, o O(6n)è una potenziale notazione per Big Oh f(n).

Ora, possiamo semplificare il 6modo in cui il Big Oh è O(n)? Sì! In tal caso g(n) = n, quindi:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

Selezioniamo c = 7poiché la sinistra aumenterebbe più rapidamente della destra.

7*n         >=  6n + 4

Vediamo che quanto sopra sarà vero per tutto ciò che nè maggiore o uguale a n0 = 4. Quindi, O(n)è una potenziale notazione Big Oh per f(n). Possiamo semplificare g(n)più? No!

Infine, abbiamo scoperto che la più semplice notazione per Big Oh f(n)è O(n). Perché abbiamo passato tutto questo? Perché ora sappiamo che f(n)è lineare , poiché la notazione Big Oh è di complessità lineare O(n). La cosa bella è che ora possiamo confrontare la complessità temporale di f(n)altri algoritmi! Per esempio, ora sappiamo che f(n)è di paragonabile nel tempo la complessità delle funzioni h(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234, ecc; perché usando lo stesso processo di semplificazione descritto sopra hanno tutti una complessità temporale lineare di O(n).

Dolce!!!


Ciao, buona spiegazione. Ho ancora qualche dubbio. 1. Non possiamo rendere 6n + 4 come O (4) poiché esiste un valore variabile 'n'. È questa la risposta? 2. mentre la semplificazione hai scelto c = 7 e corrispondentemente calcolato da n0 a 4. Che cosa ha fatto decidere c = 7 e non meno di 7? perché in base al valore di c, n0 cambierà.
Pradeep,

@Pradeep: per 1, hai ragione. Per una spiegazione più approfondita: se proviamo O(4), ciò renderebbe la nostra equazione di disuguaglianza c*4 >= 6n+4, e per qualsiasi cosa cabbiamo scelto, potremmo sempre trovare un valore in cui tutti i valori nsopra che renderebbero falsa la disuguaglianza.
Briguy37,

@Pradeep: per 2, i valori effettivi ce n0non sono importanti. Ciò che è importante è quello che n0esiste per cnoi che selezioniamo. Affinché ciò sia vero, il lato sinistro della disuguaglianza deve aumentare più rapidamente del lato destro per grandi valori di n. c=6non va bene per questo ( 6n >= 6n+4non è mai vero), quindi ho scelto c=7. Avrei potuto altrettanto facilmente raccolti c=10, c=734o c=6.0000001e sarebbe ancora potuto vedere che c'era un po ' n0che esisteva per rendere la disuguaglianza vale per n >= n0, che significa che il Big Oh stiamo testando è valido.
Briguy37,

Grazie per una chiara spiegazione. Questo è esattamente quello che stavo cercando. Grazie ancora.
Pradeep,

@Pradeep: Sono contento di poterti aiutare :)
Briguy37

1

Se si dispone di una funzione di esecuzione di 6n + 4, la domanda rilevante è "6 cosa?". Come ha chiesto un commento: cosa rappresenta la tua costante? In termini di fisica, quali sono le unità del tuo fattore costante?

Il motivo per cui la notazione O () è così ampiamente usata per descrivere le prestazioni dell'algoritmo è che non esiste un modo portatile per rispondere a questa domanda. Processori diversi impiegheranno un numero diverso di cicli di clock e diverse quantità di tempo per eseguire lo stesso calcolo elementare, oppure potrebbero raggruppare diversamente i relativi calcoli elementari. Diversi linguaggi informatici o diverse descrizioni formali e informali come lo pseudocodice rappresenteranno gli algoritmi in modi che sono difficili da confrontare direttamente. Anche le implementazioni nella stessa lingua possono rappresentare lo stesso algoritmo in modi diversi: dettagli di formattazione banali come il numero di righe a parte, avrai generalmente una vasta gamma di scelte strutturali arbitrarie per implementare un determinato algoritmo.

Guardalo in un altro modo: usiamo "algoritmo" non per descrivere una particolare implementazione, ma per descrivere un'intera classe di potenziali implementazioni della stessa procedura generale. Questa astrazione ignora i dettagli dell'implementazione a favore della documentazione di qualcosa di valore generale e il fattore di prestazione costante è uno di questi dettagli.

Detto questo, le descrizioni degli algoritmi sono spesso accompagnate da folklore, note o persino benchmark reali che descrivono le prestazioni delle implementazioni effettive sull'hardware reale. Questo ti dà un'idea approssimativa di che tipo di fattore costante aspettarti, ma dovrebbe anche essere preso con un pizzico di sale perché le prestazioni effettive dipendono da cose come quanto lavoro è stato impiegato per l'ottimizzazione di una data implementazione. Inoltre, a lungo termine, le prestazioni relative di algoritmi comparabili tendono a deteriorarsi quando l'architettura degli ultimi e dei più grandi processori cambia ...

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.