Notația Big O

De la Wikipedia, enciclopedia liberă
Jump to navigation Jump to search
Exemplu de notație Big O: f(x) ∈ O (g(x)) deoarece există c > 0 (de exemplu, c = 1) și x0 (de exemplu, x0 = 5) astfel încât f(x)c g(x) pentru orice xx0.

Notația Big O este o notație matematică care descrie comportamentul la limită⁠(d) al unei funcții atunci când argumentul⁠(d) tinde la o anumită valoare sau la infinit. Este una din notațiile inventate de Paul Bachmann,[1] Edmund Landau⁠(d),[2] și alții, numite colectiv notațiile Bachmann-Landau sau notațiile asimptotice.

În informatică, notația Big O este folosită pentru a clasifica algoritmii în funcție de felul în care timpul lor de rulare sau cerințele lor de spațiu cresc pe măsură ce crește dimensiunea datelor de intrare.[3] În teoria analitică a numerelor⁠(d), notația Big O este adesea folosită pentru a exprima o legătură între diferența dintre o funcție aritmetică⁠(d) și o aproximare mai bine înțeleasă; un exemplu celebru de astfel de diferență este termenul rest din teorema numerelor prime.

Notatia Big O caracterizează funcțiile după de vitezele lor de creștere: funcții diferite cu aceeași viteză de creștere pot fi reprezentate folosind aceeași notație O.

Litera O este folosită deoarece viteza de creștere a unei funcții este numită și ordin al funcției. O descriere a unei funcții în ceea ce privește notația Big O, de obicei, oferă doar o limită superioară⁠(d) a vitezei de creștere a funcției. Cu notația Big O mai sunt asociate mai multe alte notații, folosind simbolurile o, Ω, ω, și Θ, pentru a descrie alte tipuri de limite ale vitezelor de creștere asimptotică.

Notația Big O este folosită și în multe alte domenii pentru a furniza estimări similare.

Definiție formală[modificare | modificare sursă]

Fie f o funcție cu valori reale sau complexe și g o funcție cu valori reale, ambele fiind definite pe unele submulțimi nemărginite ale mulțimii numerelor reale pozitive, astfel încât g(x) să fie strict pozitivă pentru toate valorile suficient de mari ale lui x.[4] Se scrie

dacă și numai dacă⁠(d) pentru toate valorile suficient de mari ale lui x, valoarea absolută a lui f(x) este cel mult un multiplu constant pozitiv al lui g(x). Adică, f(x) = O(g(x)) dacă și numai dacă există un număr real pozitiv M și un număr real x0 astfel încât

În multe contexte, ipoteza că suntem interesați de viteza de creștere când variabila x tinde la infinit este lăsată nestabilită, și se scrie mai simplu că

Notația poate fi folosită și pentru a descrie comportamentul lui f în preajma unui număr real a (adesea, a = 0): se spune

dacă și numai dacă există numere pozitive δ și M astfel încât


Întrucât g(x) este aleasă în așa fel încât să fie nenulă, pentru valori ale lui x suficient de apropiate⁠(d) de a, ambele aceste definiții pot fi unificate folosind limita superioară⁠(d):


dacă și numai dacă


Exemplu[modificare | modificare sursă]

În uzul tipic, definiția oficială a notației O nu este folosită direct; mai degrabă, notația O pentru o funcție f se deduce din următoarele reguli de simplificare:

  • Dacă f(x) este o sumă de câțiva termeni, dacă există unul cu cea mai mare viteză de creștere, el poate fi păstrat și toți ceilalți omiși.
  • Dacă f(x) este un produs al mai multor factori, orice constantă (termen din produs care nu depinde de x) poate fi omisă.

De exemplu, fie f(x) = 6x4 - 2x3 + 5 și se presupune că se dorește simplificarea acestei funcții, folosind notația O, pentru a descrie viteza de creștere a acesteia când x tinde la infinit. Această funcție este suma a trei termeni: 6x4, -2x3 și 5. Din cei trei termeni, cel cu cea mai mare viteză de creștere este cel cu cel mai mare exponent în funcție de x, și anume 6x4. Acum se poate aplica a doua regulă: 6x4 este un produs de 6 și x4 în care primul factor nu depinde de x. Omiterea acestui factor are ca rezultat forma simplificată x4. Astfel, spunem că f(x) este un „big-O” al lui (x4). Matematic, putem scrie f(x) = O(x4). Se poate confirma acest calcul folosind definiția formală: fie f(x) = 6x4 - 2x3 + 5 și g(x) = x4. Aplicând definiția formală de mai sus, afirmația că f(x) = O(x4) este echivalentă cu dezvoltarea sa,

pentru un x0 și un M aleși adecvat și pentru orice x > x0. Pentru a demonstra acest lucru, fie x0 = 1 și M = 13. Atunci, pentru orice x > x0:

așa că

Utilizare[modificare | modificare sursă]

Notația Big O are două domenii principale de aplicare:

În ambele aplicații, funcția g(x) care apare în cadrul lui O (...) este de obicei aleasă așa încât să fie cât mai simplă posibil, omițând factori constanți și termeni de ordin inferior.

Există două utilizări formale apropiate, dar cu totul diferite, ale acestei notații:

Distincția aceasta există doar în practică, nu și în principiu — definiția formală pentru „big O” este aceeași pentru ambele cazuri, cu limite diferite pentru argumentul funcției.

Asimptotica infinită[modificare | modificare sursă]

Graficele funcțiilor utilizate în mod obișnuit în analiza algoritmilor, care arată numărul de operații N în raport cu dimensiunea intrării n pentru fiecare funcție

Notația Big O este utilă atunci când se analizează eficiența algoritmilor⁠(d). De exemplu, timpul (sau numărul de pași) necesar pentru a rezolva o problemă de dimensiune n poate fi găsit a fi T(n) = 4n2 - 2n + 2. Când n crește foarte mult, termenul n2 ajunge să domine, astfel încât toți ceilalți termeni pot fi neglijați, de exemplu, atunci când n = 500, termenul 4n2 este de 1000 de ori mai mare ca termenul 2n. Ignorarea acestuia din urmă ar avea un efect neglijabil asupra valorii expresiei pentru cele mai multe scopuri. Mai mult, coeficienții devin irelevanți dacă comparăm cu oricare alt ordin al expresiei, cum ar fi o expresie care conține un termen n3 sau n4. Chiar dacă T(n) = 1.000.000 n2, dacă U(n) = n3, acesta din urmă îl va depăși întotdeauna pe primul când n crește mai mare decât 1.000.000 (T(1.000.000) = 1.000.0003 = U(1.000.000)). În plus, numărul de pași depinde de detaliile modelului mașinii pe care rulează algoritmul, dar diferite tipuri de mașini variază de obicei doar printr-un factor constant în numărul de pași necesari pentru executarea unui algoritm. Deci, notația Big O surprinde ceea ce rămâne: se scrie fie

fie

și se spune că algoritmul are complexitate de ordinul lui n2. Egalul nu mai reprezintă aici egalitate în sensul matematic normal, ci mai degrabă un „este“ mai popular, astfel încât a doua expresie este uneori considerată mai precisă (a se vedea discuția de mai jos despre semnul egal) în timp ce prima este considerată de unii ca un abuz de notație⁠(d).[5]

Asimptotica infinitezimală[modificare | modificare sursă]

Big O poate fi folosită și pentru a descrie termenul de eroare într-o aproximare a unei funcții matematice. Termenii cei mai semnificativi sunt scriși explicit, iar termenii cel mai puțin semnificativi sunt rezumați într-un singur termen Big O. Considerăm, de exemplu, seria exponențială⁠(d) și două expresii ale acesteia care sunt valabile atunci când x este mic:

Cea de a doua expresie (cea cu O(x3)) înseamnă că valoarea absolută a erorii ex - (1 + x2/2) este de cel mult o constantă înmulțită cu | x3 | când x este suficient de aproape de 0.

Proprietăți[modificare | modificare sursă]

Dacă funcția f poate fi scrisă ca o sumă finită a altor funcții, atunci cea mai rapidă creștere determină ordinul lui f(n). De exemplu,

În special, dacă o funcție poate fi legată de un polinom în n, atunci când n tinde spre infinit, se pot ignora termenii de grad mai mic ai polinomului. De asemenea, mulțimile O(nc) și O(cn) sunt foarte diferiți. Dacă c este mai mare decât unu, atunci acesta crește mult mai repede. O funcție care crește mai repede decât nc pentru oricare c se numește superpolinomială. Una care crește mai lent decât orice funcție exponențială de forma cn se numește subexponențială. Un algoritm poate necesita timp atât superpolimonial cât și subexponențial; printre astfel de exemple se numără algoritmii cei mai rapizi cunoscuți pentru factorizarea numerelor întregi și funcția nlog n.

Se poate ignora orice putere a lui n din interiorul logaritmilor. Mulțimea O (log n) este exact același cu O (log nc). Logaritmii diferă numai printr-un factor constant (întrucât log nc = c log n) și astfel notația Big O ignoră termenul. Similar, logaritmii cu diferite baze constante sunt echivalenți. Pe de altă parte, exponențialele cu baze diferite nu sunt de același ordin. De exemplu, 2n nu este același lucru cu 3n.

Schimbarea unităților poate sau nu poate afecta ordinul algoritmului rezultat. Modificarea unităților este echivalentă cu înmulțirea variabilei corespunzătoare cu o constantă oriunde apare. De exemplu, dacă un algoritm rulează în timp de ordinul lui n2, înlocuirea n cu cn înseamnă că algoritmul rulează în timp de ordinul lui c2n2, iar notația Big O ignoră constanta c2. Aceasta se poate scrie ca c2n2 = O(n2). Dacă, totuși, un algoritm rulează în timp de ordinul lui 2n, înlocuirea lui n cu cn dă timp de ordinul 2cn = (2c)n. Aceasta nu este echivalentă cu 2n în general. Schimbarea variabilelor poate afecta, de asemenea, ordinul algoritmului rezultat. De exemplu, dacă timpul de execuție al algoritmului este O(n) atunci când este măsurat în termeni de număr n de cifre al unui număr de intrare x, timpul său de execuție este O(log x) ca funcție de numărul de intrare x însuși, deoarece n = O(log x).

Produsul[modificare | modificare sursă]

Suma[modificare | modificare sursă]

Aceasta înseamnă că , ceea ce înseamnă că este un con convex.

Înmulțirea cu o constantă[modificare | modificare sursă]

Fie k o constantă. Atunci:
dacă k este nenul.

Mai multe variabile[modificare | modificare sursă]

Big O (și little o, Ω, etc.) pot fi utilizate și cu mai multe variabile. Pentru a defini Big O în mod formal pentru mai multe variabile, se presupune că f și g sunt două funcții definite pe o anumită submulțime a lui . Se spune că

dacă și numai dacă [6]

În mod echivalent, condiția pentru unii poate fi înlocuită cu condiția , unde cu se notează norma Cebîșev⁠(d). De exemplu, afirmația

spune că există constantele C și M astfel încât

unde g(n, m) se definește ca

Această definiție permite ca toate componentele lui să crească până la infinit. În special, afirmația

(de exemplu, ) este destul de diferită de

(de exemplu, ).

Sub această definiție, submulțimea pe care este definită o funcție este semnificativă atunci când se generalizează afirmațiile de la contextul univariabilă la cel multivariabilă. De exemplu, dacă și , atunci dacă se restrâng f și g la , dar nu dacă acestea sunt definite pe .

Aceasta nu este singura generalizare a notației Big O la funcții multivariabilă, dar în practică există o oarecare inconsistență în alegerea definiției.[7]

Chestiuni de notație[modificare | modificare sursă]

Semnul egal[modificare | modificare sursă]

Afirmația f(x) este O(g(x)), așa cum este definită mai sus, se scrie de obicei ca f(x) = O(g(x)). Unii consideră că acest lucru este un abuz de notație⁠(d), deoarece utilizarea semnului egal ar putea fi înșelătoare, deoarece sugerează o simetrie, pe care această afirmație nu o are. După cum spune de Bruijn⁠(d), este adevărat că O(x) = O(x2), dar nu și că O(x2) = O(x).[8] Knuth denumește astfel de afirmații „egalități unidirecționale”, deoarece dacă s-ar inversa cele două părți, „am putea deduce lucruri ridicole cum ar fi n = n2 din identitățile n = O(n2)și n2 = O(n2).” [9]

Din aceste motive, ar fi mai precis să folosim notația mulțimilor⁠(d) și să scriem f(x) ∈ O(g(x)), considerând O(g(x)) ca clasă a tuturor funcțiilor h(x) astfel încât | h(x) | ≤ C | g(x) | pentru o constantă C.[9] Cu toate acestea, utilizarea semnului egal este obișnuită. Knuth a subliniat că „matematicienii folosesc în mod obișnuit semnul = așa cum folosesc cuvântul «este» în limba engleză: Aristotel este un om, dar un om nu este neapărat Aristotel.”[10]

Alți operatori aritmetici[modificare | modificare sursă]

Notația Big O poate fi utilizată și în combinație cu alți operatori aritmetici în ecuații mai complicate. De exemplu, cu h(x) + O(f(x)) se notează colecția de funcții având creșterea h(x) plus o parte a cărei creștere este limitată la f(x). Prin urmare,

exprimă același lucru ca și

Exemplu[modificare | modificare sursă]

Să presupunem că se dezvoltă un algoritm care să funcționeze pe o mulțime de n elemente. Dezvoltatorii săi sunt interesați să găsească o funcție T(n) care să exprime cât timp va dura rularea algoritmului (în unele măsurători arbitrare ale timpului) în termeni de număr de elemente din mulțimea de intrare. Algoritmul funcționează apelând mai întâi o subrutină pentru sortarea elementelor din mulțime și efectuarea propriilor operații. Sortarea are o complexitate în timp cunoscută de O(n2), iar după executarea subrutinei algoritmul trebuie să mai ruleze încă 55n3 + 2n + 10 pași înainte de a se termina. Astfel, complexitatea în timp a algoritmului poate fi exprimată ca T(n) = 55 n3 + O(n2). Aici termenii 2n + 10 sunt subsumați în cadrul lui O(n2) cu creștere mai rapidă. Din nou, această utilizare ignoră o parte din semnificația formală a simbolului „=”, dar permite utilizarea notației Big O ca un substitut convenabil.

Utilizări multiple[modificare | modificare sursă]

În utilizarea mai complicată, O (...) poate să apară în diferite locuri într-o ecuație, chiar și de mai multe ori pe fiecare parte. De exemplu, următoarele sunt valabile pentru :

Semnificația acestor afirmații este următoarea: pentru orice funcție care satisface fiecare O (...) din partea stângă, există câteva funcții care satisfac fiecare O (...) din partea dreaptă, astfel încât substituind toate aceste funcții, ecuația face ca cele două părți să fie egale. De exemplu, a treia ecuație de mai sus înseamnă: „Pentru orice funcție f(n) = O(1), există o funcție g(n) = O(en) astfel încât nf(n) = g(n).” În ceea ce privește „notația mulțimilor” de mai sus, înțelesul este că clasa de funcții reprezentată de partea stângă este o submulțime a clasei de funcții reprezentate de partea dreaptă. În această utilizare, „=” este un simbol formal care, spre deosebire de utilizarea obișnuită a lui „=”, nu este o relație simetrică⁠(d). Astfel, de exemplu, nO(1) = O(en) nu implică și afirmația falsă O(en) = nO(1)

Scriere[modificare | modificare sursă]

Big O constă doar dintr-un „O” majuscul. Spre deosebire de notațiile cu nume grecești Bachmann-Landau, nu are nevoie de un simbol special. Cu toate acestea, variantele caligrafice frecvent utilizate, cum ar fi , sunt disponibile în sistemele LaTeX și în sisteme de fonturi derivate.[11]

Ordinul de mărime al unor funcții comune[modificare | modificare sursă]

Mai jos sunt enumerate clase de funcții care se întâlnesc frecvent când se analizează timpul de funcționare al unui algoritm. În fiecare caz, c este o constantă pozitivă și n crește fără limitări. Funcțiile cu o creștere mai lentă sunt în general enumerate mai întâi.

Notație Nume Exemple
constantă Determinarea dacă un număr binar este par sau impar; Calculul lui ; Utilizarea unei tabele de corespondență⁠(d) de dimensiuni constante
dublu logaritmică Numărul de comparații folosit pentru a găsi un element folosind căutarea prin interpolare⁠(d) într-un tabel sortat de valori uniform distribuite
logaritmică Găsirea unui element într-un tablou sortat cu căutare binară sau cu un arbore⁠(d) de căutare echilibrat, precum și toate operațiile pe un heap binomial⁠(d)


polilogaritmică Ordonarea lanțurilor de matrice poate fi rezolvată în timp polilogaritmic pe o mașină cu acces aleator paralel.


putere fracționară Căutarea într-un arbore k-d⁠(d)
liniară Găsirea unui element într-o listă neordonată sau într-un tablou neordonat; adunarea a doi întregi pe n biți prin sumatoare cu transport.
n logaritm iterat⁠(d) n Efectuarea de triangulații ale unui poligon simplu folosind algoritmul lui Seidel, sau algoritmul union–find.
linearitmică, logliniară, sau cvasiliniară Efecturea unei transformări Fourier rapide⁠(d); Cea mai rapidă sortare cu comparație⁠(d); heapsort⁠(d) and merge sort
pătratică Înmulțirea a două numere cu n cifre printr-un algoritm simplu; algoritmi de sortare simpli, cum ar fi bubble sort⁠(d), selection sort⁠(d) și insertion sort⁠(d); limita (în cel mai rău caz) a unor algoritmi de regulă mai rapizi, ca quicksort, shellsort⁠(d), și Tree sort⁠(d)
polinomială sau algebrică Parsarea unor gramatici cu arbori adjuncți⁠(d); cuplajul⁠(d) maxim pentru grafuri bipartite; găsirea determinantului prin descompunere LU⁠(d)


Notația L⁠(d) sausubexponențială Factorizarea unui număr folosind ciurul pătratic⁠(d) sau ciurul algebric⁠(d)


exponențtială Găsirea soluției (exacte) a problemei comis-voiajorului folosind programare dinamică⁠(d); aflarea dacă două afirmații logice sunt echivalente folosind căutarea cu forță brută⁠(d)
factorială Rezolvarea problemei comis-voiajorului prin căutarea cu forță brută; generarea tuturor permutațiilor nerestricționate ale unei mulțimi parțial ordonate⁠(d); găsirea determinantului prin dezvoltare Laplace; enumerarea tuturor partițiilor unei mulțimi⁠(d)

Afirmația este uneori relaxată la pentru a obține formule mai simple pentru complexitatea asimptotică. Pentru orice k > 0 și c > 0, este o submulțime a lui pentru orice , deci poate fi considerat ca un polinom de grad mai mare.

Notații asimptotice asociate[modificare | modificare sursă]

Big O este cea mai frecvent folosită notație asimptotică pentru compararea funcțiilor. Împreună cu alte notații asociate, ea formează familia notațiilor Bachmann-Landau.

Notația Little-o[modificare | modificare sursă]

Intuitiv, afirmația „f(x) este o(g(x))” (a se citi f(x) este little-o de g(x) înseamnă că g(x) crește mult mai rapid decât f(x). Fie f ca înainte o funcție cu valori reale sau complexe și g o funcție cu valori reale, ambele fiind definite pe unele submulțimi nemărginite ale numerelor reale pozitive, astfel încât g(x) să fie strict pozitivă pentru toate valorile suficient de mari ale lui x. Se scrie

dacă pentru orice constantă pozitivă ε există o constantă N astfel încât

[12]

De exemplu, avem

și

Diferența dintre definiția anterioară pentru notația big-O și definiția aceasta a lui little-o este că, în timp ce prima trebuie să fie adevărată pentru cel puțin o constantă M, aceasta din urmă trebuie să fie valabilă pentru orice constantă pozitivă ε , oricât de mică ar fi.[5] În acest fel, notația little-o face o afirmație mai puternică decât notația big-O corespunzătoare: orice funcție care este little-o a lui g este de asemenea big O al lui g, dar nu orice funcție care este big-O al lui g este și little-o de g. De exemplu, dar

Deoarece g(x) este nenul, sau cel puțin devine nenul dincolo de un anumit punct, relația f(x) = o(g(x)) este echivalentă cu

(și așa a definit, de fapt, Landau [12] notația little-o).

Little-o respectă o serie de operații aritmetice. De exemplu,

dacă c este o constantă nenulă și atunci , și
dacă și atunci

De asemenea, ea satisface o relație de tranzitivitate:

dacă și atunci

Notația Big Omega[modificare | modificare sursă]

Există două definiții foarte răspândite și incompatibile ale afirmației

unde a este un număr real, ∞ sau -∞, unde f și g sunt funcții reale definite într-o vecinătate a lui a și unde g este pozitivă în această vecinătate.

Prima (cronologic) este folosită în teoria analitică a numerelor⁠(d), iar cealaltă în teoria complexității. Când se întâlnesc cele două subiecte, această situație este generatoare de confuzie.

Definiția Hardy-Littlewood[modificare | modificare sursă]

În 1914, G.H. Hardy⁠(d) și John Edensor Littlewood⁠(d) au introdus noul simbol ,[13] care este definit după cum urmează:

Prin urmare este negarea lui .

În 1916, aceiași autori au introdus cele două noi simboluri și , definite astfel:[14]

;

Aceste simboluri au fost folosite de Edmund Landau⁠(d), cu aceleași semnificații, în 1924.[15] După Landau, notațiile nu au fost niciodată folosite din nou exact așa; a devenit și a devenit .

Aceste trei simboluri , precum și (ceea ce înseamnă că sunt satisfăcute ambele relații și ), sunt acum utilizate în prezent în teoria analitică a numerelor⁠(d).[16] [17]

Exemple simple[modificare | modificare sursă]

Avem

și mai precis

Avem

și mai precis

dar

Definiția Knuth[modificare | modificare sursă]

În 1976, Donald Knuth a publicat o lucrare pentru a justifica utilizarea simbolului pentru a descrie o proprietate mai puternică. Knuth a scris: „Pentru toate aplicațiile pe care le-am văzut până acum în domeniul informaticii, o cerință mai puternică [...] este mult mai potrivită”. El a definit

cu comentariul: „Deși am schimbat definiția dată de Hardy și a Littlewood pentru , mă simt justificat în acest sens, deoarece definiția lor nu este deloc folosită pe scară largă și pentru că există și alte modalități de a spune ceea ce vor ei să spună în cazurile relativ rare în care se aplică definiția lor.”[18]

Familia de notații Bachmann-Landau[modificare | modificare sursă]

Notația Nume[18] Descriere Definiție formală Limit Definition[19][20][21][18][13]
Small O; Small Oh f este dominată de g asimptotic
Big O; Big Oh; Big Omicron este mărginită superior de g (până la un factor constant) asimptotic
Big Theta f este mărginită atât superior cât și inferior de g asimptotic și (versiunea Knuth)
De ordinul lui f este egal cu g asimptotic
Big Omega în teoria numerelor (Hardy–Littlewood) nu este dominată de g asimptotic
Big Omega în teoria complexității (Knuth) f este mărginit inferior de g asimptotic
Small Omega f domină g asimptotic

Definițiile limitelor presupun pentru n suficient de mare. Tabelul este (parțial) sortat de la cel mai mic la cel mai mare, în sensul că o, O, Θ, ~, Ω (versiunea lui Knuth), ω pe funcții corespund cu <, ≤, ≈, =, ≥, > pe dreapta reală[21] (versiunea Hardy-Littlewood a lui Ω nu corespunde însă unei astfel de descrieri).

Informatica folosește Big O, big Theta Θ, little o, omega ω și notația Big Omega Ω a lui Knuth.[22] Teoria analitică a numerelor utilizează adesea big O, small o, Big Omega Ω a lui Hardy-Littlewood (cu sau fără indicele +, - sau ±) și notațiile .[16] Notația small omega ω nu este utilizată la fel de des în analiză.[23]

Utilizarea în informatică[modificare | modificare sursă]

În mod informal, în special în domeniul informaticii, notația big O poate fi folosită oarecum diferit pentru a descrie o legătură asimptotică strânsă acolo unde notația Theta Θ ar putea fi mai potrivită într-un anumit context. De exemplu, atunci când se analizează o funcție T(n) = 73n3 + 22n2 + 58, toate afirmațiile următoare sunt în general acceptabile, dar limite mai stricte (cum ar fi numerele 2 și 3 de mai jos) sunt de obicei preferate în locul limitelor mai relaxate (cum ar fi numărul 1 de mai jos).

  1. T(n) = O(n100)
  2. T(n) = O(n3)
  3. T(n) = Θ(n3)

Afirmațiile echivalente în română sunt:

  1. T(n) crește asymptotic nu mai repede decât n100
  2. T(n) crește asymptotic nu mai repede decât n3
  3. T(n) crește asimptotic la fel de repede ca n3.

Deci, în timp ce toate cele trei afirmații sunt adevărate, în fiecare din ele există progresiv mai multe informații. În unele domenii, cu toate acestea, notația Big O (numărul 2 din listele de mai sus) ar fi folosită mai frecvent decât notația Big Theta (punctele 3 din listele de mai sus). De exemplu, dacă T(n) reprezintă timpul de funcționare a algoritmului nou dezvoltat pentru dimensiunea de intrare n, inventatorii și utilizatorii algoritmului ar putea fi mai înclinați să pună o limită asimptotică superioară timpului cât va dura funcționarea lui, fără a face vreo afirmație explicită despre limita inferioară asimptotică.

Alte notații[modificare | modificare sursă]

În cartea lor Introducere în algoritmi⁠(d), Cormen⁠(d), Leiserson⁠(d), Rivest și Stein⁠(d) iau în considerare mulțimea funcțiilor f care satisfac

Într-o notație corectă, această mulțime poate fi, de exemplu, numită O(g), unde

există constante pozitive c și astfel încât pentru toți .[24]

Autorii afirmă că folosirea operatorului de egalitate (=) pentru a nota apartenența la mulțime, în locul operatorului de apartenență încetățenit (∈), este un abuz de notație, dar acest lucru are avantaje.[25] Într-o ecuație sau inegalitate, folosirea unei notații asimptotice reprezintă o funcție anonimă din mulțimea O(g), care elimină termenii de ordin inferior și ajută la reducerea aglomerării inutile în ecuații, de exemplu: [26]

Extensii la notațiile Bachmann-Landau[modificare | modificare sursă]

O altă notație folosită uneori în domeniul informaticii este Õ (citiți soft-O): f(n) = Õ(g(n)) este o prescurtare pentru f(n) = O(g(n) log k g(n)) pentru un anume k. În esență, este o notație Big O, ignorând factorii logaritmici, deoarece efectele ratei de creștere a unei alte funcții superlogaritmice indică o explozie a ratei de creștere pentru parametrii de intrare de dimensiuni mari, care este mai importantă pentru a prezice relele performanțe efectele mai fine cu care contribuie de factorul (factorii) de creștere logaritmică. Această notație este adesea folosită pentru a evita „pierderea în amănunte” în cadrul vitezelor de creștere care sunt declarate ca fiind prea strâns mărginite pentru chestiunea relevantă (întrucât logk n este întotdeauna o(nε) pentru orice constantă k și orice ε > 0).

De asemenea, notația L⁠(d), definită ca

este convenabilă pentru funcțiile care sunt între polinomială și exponențială în raport cu .

Generalizări și utilizări conexe[modificare | modificare sursă]

Generalizarea funcțiilor care iau valori în orice spațiu vectorial normat este simplă (înlocuind valoarea absolută cu norma), unde f și g nu este nevoie săi aibă valori în același spațiu. O generalizare a funcțiilor g cu valori în orice grup topologic⁠(d) este de asemenea posibilă. „Procesul de limitare” xx0 poate fi și el generalizat prin introducerea unei baze de filtrare⁠(d) arbitrare, adică a rețelelor⁠(d) direcționate f și g. Notația o poate fi folosită pentru a defini derivate și diferențiabilitatea⁠(d) în spații destul de generale, precum și echivalența (asimptotică) a funcțiilor,

care este o relație de echivalență și o noțiune mai restrictivă decât relația „f este Θ(g)” de mai sus. (Se reduce la lim f/g = 1 dacă f și g sunt funcții cu valoare reală pozitivă.) De exemplu, 2x este Θ(x), dar 2x - x nu este o(x).

Istorie (notații Bachmann-Landau, Hardy și Vinogradov)[modificare | modificare sursă]

Simbolul O a fost introdus pentru prima dată de teoreticianul numerelor Paul Bachmann în 1894, în al doilea volum al cărții sale Analytische Zahlentheorie („Teoria analitică a numerelor⁠(d)”), al cărei prim volum (care nu conținea încă notația Big O) a fost publicat în 1892.[1] Teoreticianul numerelor Edmund Landau⁠(d) a adoptat-o și, astfel, a fost inspirat să introducă în 1909 notația o; [2] aici ambele sunt numite acum simboluri Landau. Aceste notații au fost folosite în matematica aplicată în anii 1950 pentru analiza asimptotică.[27] Simbolul (în sensul „nu este o de”) a fost introdus în 1914 de Hardy și Littlewood.[13] Hardy și Littlewood au introdus, de asemenea, în 1918 simbolurile („dreapta”) și („stânga”), [14] precursori ai simbolurilor moderne („nu este mai mică decât small o de”) și („nu este mai mare decât small o de”). Astfel, simbolurile Omega (cu semnificațiile lor originale) sunt uneori denumite și „simboluri Landau”. Această notație a devenit frecvent folosită în teoria numerelor cel puțin din anii 1950.[28] În anii 1970, Big O a fost popularizată în domeniul informaticii de către Donald Knuth, care a introdus notația aferentă Theta și a propus o altă definiție pentru notația Omega.[18]

Landau nu a folosit niciodată Theta mare și simboluri omega-mic.

Simbolurile lui Hardy erau (din punct de vedere al notației O moderne)

  and  

(Hardy însă nu a definit niciodată și nu a folosit notația , nici , așa cum s-a afirmat uneori). De asemenea, Hardy a introdus simbolurile și (precum și alte simboluri) în tratatul său din 1910, „Orders of Infinity”, și îl folosește doar în trei lucrări (1910-1913). În restul de aproape 400 de lucrări și cărți, el folosește consistent simbolurile Landau O și o.

Notația lui Hardy nu mai este folosită. Pe de altă parte, în 1930,[29] teoreticianului rus al numerelor Ivan Matveievici Vinogradov⁠(d) a introdus notația lui, , care este folosită din ce în ce mai mult în teoria numerelor în locul notației . Avem

și în mod obișnuit ambele notații sunt utilizate în aceeași lucrare.

Big O reprezenta inițial „de ordinul lui” ("Ordnung", Bachmann 1894) și este așadar o literă latină. Nici Bachmann, nici Landau nu o numesc vreodată „Omicron”. Simbolul a fost considerat mult mai târziu (1976) de către Knuth drept omicron mare[18] probabil în legătură cu definiția sa a simbolului Omega. Nu se folosește cifra zero.

Note[modificare | modificare sursă]

  1. ^ a b Bachmann, Paul (). Analytische Zahlentheorie [Analytic Number Theory] (în germană). 2. Leipzig: Teubner. 
  2. ^ a b Landau, Edmund (). Handbuch der Lehre von der Verteilung der Primzahlen [Manual de teoria distribuției numerelor prime] (în germană). Leipzig: B. G. Teubner. p. 883. 
  3. ^ Mohr, Austin. „Quantum Computing in Complexity Theory and Theory of Computation” (PDF) (în engleză). p. 2. Accesat în . 
  4. ^ Landau, Edmund (). Handbuch der Lehre von der Verteilung der Primzahlen [Manual de teoria distribuției numerelor prime] (în germană). Leipzig: B. G. Teubner. p. 31. 
  5. ^ a b Thomas H. Cormen et al., 2001, Introduction to Algorithms, Second Edition[necesită pagina]
  6. ^ Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (). Introduction to Algorithms [Introducere în algoritmi] (în engleză) (ed. Third). MIT. p. 53. 
  7. ^ Howell, Rodney. „On Asymptotic Notation with Multiple Variables” (PDF). Accesat în . 
  8. ^ Nicolaas Govert de Bruijn⁠(d) (). Asymptotic Methods in Analysis. Amsterdam: North-Holland. pp. 5–7. ISBN 978-0-486-64221-5. 
  9. ^ a b Graham, Ronald; Knuth, Donald; Patashnik, Oren (). Concrete Mathematics (ed. 2). Reading, Massachusetts: Addison–Wesley. p. 446. ISBN 978-0-201-55802-9. 
  10. ^ Donald Knuth (). „Teach Calculus with Big O” (PDF). Notices of the American Mathematical Society⁠(d). 45 (6): 687.  (Unabridged version)
  11. ^ Tom (). „Big O and related notations in LaTeX”. texblog (în engleză). 
  12. ^ a b Landau, Edmund (). Handbuch der Lehre von der Verteilung der Primzahlen [Handbook on the theory of the distribution of the primes] (în germană). Leipzig: B. G. Teubner. p. 61. 
  13. ^ a b c Hardy, G. H.; Littlewood, J. E. (). „Some problems of diophantine approximation: Part II. The trigonometrical series associated with the elliptic ϑ-functions”. Acta Mathematica (în engleză). 37: 225. doi:10.1007/BF02401834. 
  14. ^ a b GH Hardy și JE Littlewood, „Contribution to the theory of the Riemann zeta-function and the theory of the distribution of primes”, Acta Mathematica , vol. 41, 1916.
  15. ^ E. Landau, "De la Anzahl der Gitterpunkte in gewissen Bereichen." NAChR. Gesell. Wiss. Gott. Math-Phys. Kl. 1924, 137-150.
  16. ^ a b Aleksandar Ivić. The Riemann zeta-function, capitolul 9. John Wiley & Sons 1985.
  17. ^ Gérald Tenenbaum, Introduction to analytic and probabilistic number theory, capitolul I.5. American Mathematical Society, Providence RI, 2015.
  18. ^ a b c d e Donald Knuth. " Big Omicron and big Omega and big Theta ", SIGACT News, aprilie-iunie 1976, 18-24.
  19. ^ Balcázar, José L.; Gabarró, Joaquim. „Nonuniform complexity classes specified by lower and upper bounds” (PDF). RAIRO – Theoretical Informatics and Applications – Informatique Théorique et Applications (în engleză). 23 (2): 180. ISSN 0988-3754. Accesat în . 
  20. ^ Cucker, Felipe; Bürgisser, Peter (). „A.1 Big Oh, Little Oh, and Other Comparisons”. Condition: The Geometry of Numerical Algorithms. Berlin, Heidelberg: Springer. pp. 467–468. doi:10.1007/978-3-642-38896-5. ISBN 978-3-642-38896-5. 
  21. ^ a b Vitányi, Paul; Meertens, Lambert (aprilie 1985). „Big Omega versus the wild functions” (PDF). ACM SIGACT News (în engleză). 16 (4): 56–59. doi:10.1145/382242.382835. 
  22. ^ Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford () [1990]. Introduction to Algorithms⁠(d) (ed. 2nd). MIT Press and McGraw-Hill. pp. 41–50. ISBN 0-262-03293-7. 
  23. ^ de exemplu, este omisă în: Hildebrand, A.J. „Asymptotic Notations” (PDF). Asymptotic Methods in Analysis (în engleză). Math 595, Fall 2009. Accesat în . 
  24. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest (). Introduction to Algorithms (în engleză) (ed. 3rd). Cambridge/MA: MIT Press. p. 47. ISBN 978-0-262-53305-8. When we have only an asymptotic upper bound, we use O-notation. For a given function g(n), we denote by O(g(n)) (pronounced “big-oh of g of n” or sometimes just “oh of g of n”) the set of functions O(g(n)) = { f(n) : there exist positive constants c and n0 such that 0 ≤ f(n) ≤ cg(n) for all nn0} 
  25. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest (). Introduction to Algorithms (ed. 3rd). Cambridge/MA: MIT Press. p. 45. ISBN 978-0-262-53305-8. Because θ(g(n)) is a set, we could write "f(n) ∈ θ(g(n))" to indicate that f(n) is a member of θ(g(n)). Instead, we will usually write f(n) = θ(g(n)) to express the same notion. You might be confused because we abuse equality in this way, but we shall see later in this section that doing so has its advantages. 
  26. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest (). Introduction to Algorithms (în engleză) (ed. 3rd). Cambridge/MA: MIT Press. p. 49. ISBN 978-0-262-53305-8. When the asymptotic notation stands alone (that is, not within a larger formula) on the right-hand side of an equation (or inequality), as in n = O(n²), we have already defined the equal sign to mean set membership: n ∈ O(n²). In general, however, when asymptotic notation appears in a formula, we interpret it as standing for some anonymous function that we do not care to name. For example, the formula 2n2 + 3n + 1 = 2n2 + θ(n) means that 2n2 + 3n + 1 = 2n2 + f(n), where f(n) is some function in the set θ(n). In this case, we let f(n) = 3n + 1, which is indeed in θ(n). Using asymptotic notation in this manner can help eliminate inessential detail and clutter in an equation. 
  27. ^ Erdelyi, A. (). Asymptotic Expansions. ISBN 978-0-486-60318-6. 
  28. ^ EC Titchmarsh, The Theory of the Riemann Zeta-Function (Oxford, Clarendon Press, 1951)
  29. ^ Vezi de exemplu „O nouă estimare pentru G(n) în problema lui Waring” (în rusă). Doklady Akademii Nauk SSSR 5, No 5-6 (1934), 249–253. Traducere în engleză în: Selected works / Ivan Matveevič Vinogradov ; îngrijită de Institutul Matematic Steklov al Academiei de Științe a URSS cu ocazia sărbătoririi a 90 de ani de la nașterea lui. Springer-Verlag, 1985.

Lectură suplimentară[modificare | modificare sursă]

Legături externe[modificare | modificare sursă]