logo

Big O -merkinnän opetusohjelma – opas Big O -analyysiin

Iso O-merkintä on tehokas työkalu, jota käytetään tietojenkäsittelytieteessä kuvaamaan algoritmien aika- tai tilamonimutkaisuutta. Se tarjoaa standardoidun tavan verrata eri algoritmien tehokkuutta niiden pahimman mahdollisen suorituskyvyn suhteen. Ymmärtäminen Iso O-merkintä on välttämätöntä tehokkaiden algoritmien analysoinnissa ja suunnittelussa.

Tässä opetusohjelmassa käsittelemme perusasiat Iso O-merkintä , sen merkitys ja kuinka analysoida algoritmien monimutkaisuutta käyttämällä Iso O .



Sisällysluettelo

Mikä on Big-O-merkintä?

Iso-O , jota kutsutaan yleisesti nimellä Järjestys , on tapa ilmaista yläraja algoritmin aikamonimutkaisuudesta, koska se analysoi Pahimmassa tapauksessa algoritmin tilanne. Se tarjoaa an yläraja algoritmin käyttämä aika tulon koon mukaan. Se on merkitty nimellä O(f(n)) , missä f(n) on funktio, joka edustaa operaatioiden (askeleiden) määrää, jonka algoritmi suorittaa ratkaistakseen kokoongelman n .

Big-O-merkintä käytetään kuvaamaan algoritmin suorituskykyä tai monimutkaisuutta. Tarkemmin sanottuna se kuvaa pahimmassa tapauksessa suhteen aika tai tilan monimutkaisuus.

Tärkeä pointti:

  • Iso O-merkintä kuvaa vain funktion asymptoottista käyttäytymistä, ei sen tarkkaa arvoa.
  • The Iso O-merkintä voidaan verrata eri algoritmien tai tietorakenteiden tehokkuutta.

Big-O-merkinnän määritelmä:

Annettu kaksi toimintoa f(n) ja g(n) , sanomme niin f(n) On O(g(n)) jos on olemassa vakioita c> 0 ja n 0 >= 0 sellaista f(n) <= c*g(n) kaikille n>= n 0 .

Yksinkertaisemmin sanottuna f(n) On O(g(n)) jos f(n) ei kasva nopeammin kuin c*g(n) kaikille n>= n0missä c ja n0ovat vakioita.

Miksi Big O -merkintä on tärkeä?

Big O -merkintä on matemaattinen merkintä, jota käytetään kuvaamaan algoritmin pahimman tapauksen aikamonimutkaisuutta tai tehokkuutta tai tietorakenteen pahimman tapauksen avaruuden monimutkaisuutta. Se tarjoaa tavan verrata eri algoritmien ja tietorakenteiden suorituskykyä ja ennustaa, kuinka ne käyttäytyvät syötteen koon kasvaessa.

Iso O-merkintä on tärkeä useista syistä:

  • Big O Notation on tärkeä, koska se auttaa analysoimaan algoritmien tehokkuutta.
  • Se tarjoaa tavan kuvata, kuinka suoritusaika tai tilavaatimukset algoritmi kasvaa syötteen koon kasvaessa.
  • Antaa ohjelmoijille mahdollisuuden verrata erilaisia ​​algoritmeja ja valita tehokkain tiettyyn ongelmaan.
  • Auttaa ymmärtämään algoritmien skaalautuvuutta ja ennustamaan, kuinka ne toimivat syötteen koon kasvaessa.
  • Antaa kehittäjille mahdollisuuden optimoida koodia ja parantaa yleistä suorituskykyä.

Big O -merkinnän ominaisuudet:

Alla on joitain tärkeitä Big O -merkinnän ominaisuuksia:

arraylist lajitella

1. Heijastuskyky:

Mille tahansa funktiolle f(n), f(n) = O(f(n)).

Esimerkki:

f(n) = n2, niin f(n) = O(n2).

2. Transitiivisuus:

Jos f(n) = O(g(n)) ja g(n) = O(h(n)), niin f(n) = O(h(n)).

Esimerkki:

f(n) = n3, g(n) = n2, h(n) = n4. Sitten f(n) = O(g(n)) ja g(n) = O(h(n)). Siksi f(n) = O(h(n)).

3. Vakiokerroin:

Jokaiselle vakiolle c> 0 ja funktioille f(n) ja g(n), jos f(n) = O(g(n)), niin cf(n) = O(g(n)).

Esimerkki:

f(n) = n, g(n) = n2. Silloin f(n) = O(g(n)). Siksi 2f(n) = O(g(n)).

4. Summa-sääntö:

Jos f(n) = O(g(n)) ja h(n) = O(g(n)), niin f(n) + h(n) = O(g(n)).

Esimerkki:

f(n) = n2, g(n) = n3, h(n) = n4. Sitten f(n) = O(g(n)) ja h(n) = O(g(n)). Siksi f(n) + h(n) = O(g(n)).

5. Tuotesääntö:

Jos f(n) = O(g(n)) ja h(n) = O(k(n)), niin f(n) * h(n) = O(g(n) * k(n)) .

Esimerkki:

f(n) = n, g(n) = n2, h(n) = n3, k(n) = n4. Sitten f(n) = O(g(n)) ja h(n) = O(k(n)). Siksi f(n) * h(n) = O(g(n) * k(n)) = O(n)5).

6. Koostumussääntö:

Jos f(n) = O(g(n)) ja g(n) = O(h(n)), niin f(g(n)) = O(h(n)).

Esimerkki:

f(n) = n2, g(n) = n, h(n) = n3. Sitten f(n) = O(g(n)) ja g(n) = O(h(n)). Siksi f(g(n)) = O(h(n)) = O(n3).

Yleiset Big-O-merkinnät:

Big-O-merkintä on tapa mitata algoritmin aika- ja tilamonimutkaisuutta. Se kuvaa monimutkaisuuden ylärajaa pahimmassa tapauksessa. Tarkastellaan erityyppisiä aikamonimutkauksia:

1. Lineaarinen aikamonimutkaisuus: Big O(n) -monimutkaisuus

Lineaarinen aikamonimutkaisuus tarkoittaa, että algoritmin käyntiaika kasvaa lineaarisesti syötteen koon mukaan.

Harkitse esimerkiksi algoritmia, joka kulkee taulukon läpi löytääkseen tietyn elementin :

Koodikatkelma
bool findElement(int arr[], int n, int key) {  for (int i = 0; i < n; i++) {  if (arr[i] == key) {  return true;  }  }  return false; }>

2. Logaritminen aikamonimutkaisuus: Big O(log n) -monimutkaisuus

Logaritminen aikakompleksisuus tarkoittaa, että algoritmin ajoaika on verrannollinen syötteen koon logaritmiin.

Esimerkiksi a binäärihakualgoritmi on logaritminen aikamonimutkaisuus:

Koodinpätkä
int binarySearch(int arr[], int l, int r, int x) {  if (r>= l) { int mid = l + (r - l) / 2;  if (arr[mid] == x) return mid;  if (arr[mid]> x) return binarySearch(arr, l, mid - 1, x);  return binarySearch(arr, mid + 1, r, x);  } paluu -1; }>

3. Kvadraattisen ajan monimutkaisuus: Big O(n2) Monimutkaisuus

Neliöllinen aikamonimutkaisuus tarkoittaa, että algoritmin ajoaika on verrannollinen syötteen koon neliöön.

Esimerkiksi yksinkertainen kuplalajittelualgoritmi sillä on neliöllinen aikamonimutkaisuus:

Koodinpätkä
void bubbleSort(int arr[], int n) {  for (int i = 0; i < n - 1; i++) {  for (int j = 0; j < n - i - 1; j++) {  if (arr[j]>arr[j + 1]) { swap(&arr[j], &arr[j + 1]);  } } } }>

4. Kuutioajan monimutkaisuus: Big O(n3) Monimutkaisuus

Kuutioaikainen monimutkaisuus tarkoittaa, että algoritmin ajoaika on verrannollinen syötteen koon kuutioon.

Esimerkiksi naivi matriisin kertolaskualgoritmi sillä on kuutioaikainen monimutkaisuus:

Koodinpätkä
void multiply(int mat1[][N], int mat2[][N], int res[][N]) {  for (int i = 0; i < N; i++) {  for (int j = 0; j < N; j++) {  res[i][j] = 0;  for (int k = 0; k < N; k++)  res[i][j] += mat1[i][k] * mat2[k][j];  }  } }>

5. Polynomiajan monimutkaisuus: Big O(nk) Monimutkaisuus

Polynominen aikakompleksisuudella tarkoitetaan algoritmin aikamonimutkaisuutta, joka voidaan ilmaista syötteen koon polynomifunktiona n . Isossa O merkintätapa, algoritmilla sanotaan olevan polynominen aikamonimutkaisuus, jos sen aikamonimutkaisuus on Päällä k ) , missä k on vakio ja edustaa polynomin astetta.

Algoritmeja, joiden aika monimutkaisuus on polynomi, pidetään yleensä tehokkaina, koska ajoaika kasvaa kohtuullista vauhtia syötteen koon kasvaessa. Yleisiä esimerkkejä algoritmeista, joiden aika monimutkaisuus on polynomi, ovat mm lineaarinen aikakompleksi O(n) , neliöllinen aikakompleksi O(n 2 ) , ja kuutioaika monimutkaisuus O(n 3 ) .

6. Eksponentiaalinen aikamonimutkaisuus: Big O(2n) Monimutkaisuus

Eksponentiaalinen aikamonimutkaisuus tarkoittaa, että algoritmin ajoaika kaksinkertaistuu jokaisen lisäyksen yhteydessä syöttötietosarjaan.

Esimerkiksi ongelma luomalla joukon kaikki osajoukot on eksponentiaalisesti monimutkainen:

Koodinpätkä
void generateSubsets(int arr[], int n) {  for (int i = 0; i < (1 << n); i++) {  for (int j = 0; j < n; j++) {  if (i & (1 << j)) {  cout << arr[j] << ' ';  }  }  cout << endl;  } }>

Faktoriaalinen ajan monimutkaisuus: Suuri O(n!) Monimutkaisuus

Faktoriaalinen aikamonimutkaisuus tarkoittaa, että algoritmin ajoaika kasvaa tekijällisesti syötteen koon mukaan. Tämä näkyy usein algoritmeissa, jotka luovat kaikki tietojoukon permutaatiot.

Tässä on esimerkki tekijän aikakompleksisuuden algoritmista, joka luo kaikki taulukon permutaatiot:

Koodinpätkä
void permute(int* a, int l, int r) {  if (l == r) {  for (int i = 0; i <= r; i++) {  cout << a[i] << ' ';  }  cout << endl;  }  else {  for (int i = l; i <= r; i++) {  swap(a[l], a[i]);  permute(a, l + 1, r);  swap(a[l], a[i]); // backtrack  }  } }>

Jos piirrämme yleisimmät Big O -merkintäesimerkit, saamme seuraavanlaisen kaavion:

asymtoottinen analyysi

Kuinka määrittää suuri O-merkintä?

Iso O-merkintä on matemaattinen merkintä, jota käytetään kuvaamaan asymptoottinen käyttäytyminen funktiosta, kun sen syöte kasvaa äärettömän suureksi. Se tarjoaa tavan karakterisoida algoritmien ja tietorakenteiden tehokkuutta.

Vaiheet suuren O-merkinnän määrittämiseksi:

1. Tunnista hallitseva termi:

  • Tutki funktiota ja tunnista termi, jonka kasvu on suurinta syötteen koon kasvaessa.
  • Ohita kaikki vakiotekijät tai alemman kertaluvun termit.

2. Määritä kasvujärjestys:

  • Dominoivan termin kasvujärjestys määrittää Big O -merkinnän.

3. Kirjoita iso O-merkintä:

  • Big O -merkintä kirjoitetaan muodossa O(f(n)), missä f(n) edustaa hallitsevaa termiä.
  • Esimerkiksi jos hallitseva termi on n^2, Big O -merkintä olisi O(n^2).

4. Yksinkertaista merkintää (valinnainen):

  • Joissakin tapauksissa Big O -brändäys n voidaan yksinkertaistaa poistamalla vakiotekijät tai käyttämällä suppeampaa merkintää.
  • Esimerkiksi, O(2n) voidaan yksinkertaistaa Päällä).

Esimerkki:

Funktio: f(n) = 3n3+ 2n2+ 5n + 1

  1. Hallitseva termi: 3n3
  2. Kasvujärjestys: Kuutio (n3)
  3. Iso O-merkintä: O(n3)
  4. Yksinkertaistettu merkintä: O(n3)

Matemaattisia esimerkkejä ajonaikaisesta analyysistä:

Alla oleva taulukko havainnollistaa erilaisten algoritmien ajonaikaista analyysiä syötteen koon (n) kasvaessa.

nloki(n)nn * log(n)n^22^nn!
101101010010243628800
kaksikymmentä2 996kaksikymmentä59.940010485762,432902e+1818

Algoritmisia esimerkkejä ajonaikaisesta analyysistä:

Alla oleva taulukko luokittelee algoritmit niiden ajonaikaisen monimutkaisuuden perusteella ja tarjoaa esimerkkejä jokaisesta tyypistä.

TyyppiMerkintäEsimerkkialgoritmit
LogaritminenO(log n)Binäärihaku
LineaarinenPäällä)Lineaarinen haku
SuperlineaarinenO(n log n)Kasalajittelu, yhdistämislajittelu
PolynomiO(n^c)Strassenin matriisikerto, kuplalajittelu, valintalajittelu, lisäyslajittelu, ämpärilajittelu
EksponentiaalinenO(c^n)Hanoin torni
FactorialPäällä!)Alaikäisten määräävä laajeneminen, raaka voima Hakualgoritmi matkustavaan myyjäongelmaan

Algoritmiluokat operaatioiden lukumäärän ja suoritusajan kanssa:

Alla on algoritmien luokat ja niiden suoritusajat suoritettavassa tietokoneessa 1 miljoona toimintoa sekunnissa (1 s = 10 6 μs = 10 3 ms) :

Suuret O-merkintäluokat

f(n)

Big O -analyysi (operaatioiden määrä) arvolle n = 10

Suoritusaika (1 käsky/μs)

vakio

O(1)

konekirjoituspäivämäärä

1

1 μs

logaritminen

O (kirjaudu sisään)

3.32

3 μs

lineaarinen

Päällä)

10

10 μs

O (ei kirjaudu sisään)

O (ei kirjaudu sisään)

33.2

33 μs

neliöllinen

Päällä2)

102

100 μs

kuutio

Päällä3)

103

1 ms

eksponentiaalinen

O(2n)

1024

10 ms

tekijällinen

Päällä!)

.tostring java

10!

3,6288 s

Big O -merkinnän, Big Ω (Omega) -merkinnän ja Big θ (Theta) -merkinnän vertailu:

Alla on taulukko, jossa verrataan Big O -merkintää, Ω (Omega) -merkintää ja θ (Theta) -merkintää:

MerkintäMääritelmäSelitys
Iso O (O)f(n) ≤ C * g(n) kaikille n ≥ n0Kuvaa algoritmin toiminta-ajan ylärajaa Pahimmassa tapauksessa .
Ω (Omega)f(n) ≥ C * g(n) kaikille n ≥ n0Kuvaa algoritmin toiminta-ajan alarajaa paras tapaus .
θ (theta)C1* g(n) ≤ f(n) ≤ C2* g(n), jos n ≥ n0Kuvaa sekä algoritmin ylä- että alarajaa käyntiaika .

Jokaisessa merkinnässä:

  • f(n) edustaa analysoitavaa funktiota, tyypillisesti algoritmin aikamonimutkaisuutta.
  • g(n) edustaa tiettyä toimintoa, joka rajoittaa f(n) .
  • C, C1, ja C2 ovat vakioita.
  • n 0 on pienin syötekoko, jonka ylittävä epäyhtälö pätee.

Näitä merkintöjä käytetään algoritmien analysointiin niiden perusteella pahin tapaus (Big O) , paras tapaus (Ω) , ja keskimääräinen tapaus (θ) skenaarioita.

Usein kysyttyjä kysymyksiä Big O -merkinnöistä:

Kysymys 1. Mikä on Big O -merkintä?

Vastaus: Big O Notation on matemaattinen merkintä, jota käytetään kuvaamaan algoritmin aikamonimutkaisuuden ylärajaa sen mukaan, kuinka se kasvaa syötteen kokoon nähden.

Kysymys 2. Miksi Big O -merkintä on tärkeä?

Vastaus: Se auttaa meitä analysoimaan ja vertailemaan algoritmien tehokkuutta keskittymällä pahimpaan mahdolliseen skenaarioon ja ymmärtämällä, kuinka niiden suorituskyky skaalautuu syötteen koon mukaan.

Kysymys 3. Miten Big O -merkintä lasketaan?

Vastaus: Big O -merkintä määritetään tunnistamalla hallitseva operaatio algoritmissa ja ilmaisemalla sen aikamonimutkaisuus n:llä, jossa n edustaa syötteen kokoa.

Kysymys 4. Mitä O(1) tarkoittaa suuressa O-merkinnässä?

Vastaus: O(1) tarkoittaa jatkuvaa ajan monimutkaisuutta, mikä osoittaa, että algoritmin suoritusaika ei muutu syötteen koosta riippumatta.

Kysymys 5. Mikä on erilaisten Big O -kompleksien, kuten O(log n) tai O(n^2), merkitys?

Vastaus: Erilaiset monimutkaisuudet, kuten O(log n) tai O(n^2), kuvaavat, kuinka algoritmin suorituskyky skaalautuu syötteen koon kasvaessa, mikä antaa käsityksen sen tehokkuudesta ja skaalautumisesta.

Kysymys 6. Voidaanko Big O Notationia soveltaa myös avaruuden monimutkaisuuteen?

Vastaus: Kyllä, Big O Notationia voidaan käyttää myös algoritmin tilan monimutkaisuuden analysointiin ja kuvaamiseen, mikä osoittaa, kuinka paljon muistia se vaatii suhteessa tulokokoon.

Aiheeseen liittyvä artikkeli: