Zoeken…


Opmerkingen

Alle algoritmen zijn een lijst met stappen om een probleem op te lossen. Elke stap heeft afhankelijkheden van een aantal eerdere stappen of het begin van het algoritme. Een klein probleem kan er als volgt uitzien:

voer hier de afbeeldingsbeschrijving in

Deze structuur wordt een gerichte acyclische grafiek of kortweg DAG genoemd. De koppelingen tussen elk knooppunt in de grafiek vertegenwoordigen afhankelijkheden in de volgorde van bewerkingen en er zijn geen cycli in de grafiek.

Hoe komen afhankelijkheden tot stand? Neem bijvoorbeeld de volgende code:

total = 0
for(i = 1; i < 10; i++)
    total = total + i

In deze psuedocode is elke iteratie van de for-lus afhankelijk van het resultaat van de vorige iteratie omdat we de waarde gebruiken die is berekend in de vorige iteratie in deze volgende iteratie. De DAG voor deze code kan er zo uitzien:

voer hier de afbeeldingsbeschrijving in

Als u deze weergave van algoritmen begrijpt, kunt u deze gebruiken om de complexiteit van algoritmen te begrijpen in termen van werk en spanwijdte.

Werk

Werk is het werkelijke aantal bewerkingen dat moet worden uitgevoerd om het doel van het algoritme voor een gegeven invoergrootte n .

Span

Span wordt soms het kritieke pad genoemd en is het minste aantal stappen dat een algoritme moet nemen om het doel van het algoritme te bereiken.

De volgende afbeelding markeert de grafiek om de verschillen tussen werk en overspanning op onze voorbeeld-DAG weer te geven.

voer hier de afbeeldingsbeschrijving in

Het werk is het aantal knooppunten in de grafiek als geheel. Dit wordt weergegeven door de grafiek links hierboven. De overspanning is het kritieke pad, of het langste pad van het begin tot het einde. Wanneer parallel kan worden gewerkt, vertegenwoordigen de geel gemarkeerde knooppunten aan de rechterkant het bereik, het minste aantal benodigde stappen. Wanneer het werk in serie moet worden gedaan, is de overspanning hetzelfde als het werk.

Zowel werk als overspanning kunnen onafhankelijk van elkaar worden geëvalueerd in termen van analyse. De snelheid van een algoritme wordt bepaald door de overspanning. De benodigde rekenkracht wordt bepaald door het werk.

Big-Theta-notatie

In tegenstelling tot de Big-O-notatie, die voor sommige algoritmen alleen de bovengrens van de looptijd vertegenwoordigt, is Big-Theta een strakke grens; zowel boven- als ondergrens. Strak gebonden is nauwkeuriger, maar ook moeilijker te berekenen.

De Big-Theta-notatie is symmetrisch: f(x) = Ө(g(x)) <=> g(x) = Ө(f(x))

Een intuïtieve manier om het te begrijpen, is dat f(x) = Ө(g(x)) betekent dat de grafieken van f (x) en g (x) in dezelfde snelheid groeien, of dat de grafieken zich 'even groot' gedragen voldoende waarden van x.

De volledige wiskundige uitdrukking van de Big-Theta-notatie is als volgt:
Ө (f (x)) = {g: N 0 -> R en c 1 , c 2 , n 0 > 0, waarbij c 1 <abs (g (n) / f (n)), voor elke n> n 0 en abs is de absolute waarde}

Een voorbeeld

Als het algoritme voor de invoer n 42n^2 + 25n + 4 bewerkingen nodig heeft om te eindigen, zeggen we dat dit O(n^2) , maar ook O(n^3) en O(n^100) . Het is echter Ө(n^2) en het is niet Ө(n^3) , Ө(n^4) enz. Algoritme dat Ө(f(n)) is, is ook O(f(n)) , maar niet vice versa!

Formele wiskundige definitie

Ө(g(x)) is een set functies.

Ө(g(x)) = {f(x) such that there exist positive constants c1, c2, N such that 0 <= c1*g(x) <= f(x) <= c2*g(x) for all x > N}

Omdat Ө(g(x)) een set is, kunnen we f(x) ∈ Ө(g(x)) om aan te geven dat f(x) lid is van Ө(g(x)) . In plaats daarvan schrijven we meestal f(x) = Ө(g(x)) om hetzelfde idee uit te drukken - dat is de gebruikelijke manier.

Telkens wanneer Ө(g(x)) in een formule voorkomt, interpreteren we het als een anonieme functie die we niet graag noemen. De vergelijking T(n) = T(n/2) + Ө(n) betekent bijvoorbeeld T(n) = T(n/2) + f(n) waarbij f(n) een functie is in de verzameling Ө(n) .

Laat f en g twee functies zijn die zijn gedefinieerd op een subset van de reële getallen. We schrijven f(x) = Ө(g(x)) als x->infinity als en alleen als er positieve constanten K en L en een reëel getal x0 zodanig dat geldt:

K|g(x)| <= f(x) <= L|g(x)| voor alle x >= x0 .

De definitie is gelijk aan:

f(x) = O(g(x)) and f(x) = Ω(g(x))

Een methode die limieten gebruikt

als limit(x->infinity) f(x)/g(x) = c ∈ (0,∞) dwz dat de limiet bestaat en positief is, dan is f(x) = Ө(g(x))

Gemeenschappelijke complexiteitsklassen

Naam schrijfwijze n = 10 n = 100
Constante Ө (1) 1 1
logaritmische Ө (log (n)) 3 7
Lineair Ө (n) 10 100
Linearithmic Ө (n * log (n)) 30 700
vierkant Ө (n ^ 2) 100 10 000
exponentiële Ө (2 ^ n) 1 024 1.267650e + 30
factorial Ө (n!) 3 628 800 9.332622e + 157

Big-Omega-notatie

Ω-notatie wordt gebruikt voor asymptotische ondergrens.

Formele definitie

Laat f(n) en g(n) twee functies zijn die zijn gedefinieerd op de set van de positieve reële getallen. We schrijven f(n) = Ω(g(n)) als er positieve constanten c en n0 zodat:

0 ≤ cg(n) ≤ f(n) for all n ≥ n0 .

Notes

f(n) = Ω(g(n)) betekent dat f(n) asymptotisch groeit niet langzamer dan g(n) . We kunnen ook zeggen over Ω(g(n)) wanneer algoritmeanalyse niet genoeg is voor een uitspraak over Θ(g(n)) of / en O(g(n)) .

Uit de definities van notaties volgt de stelling:

Voor twee functies f(n) en g(n) hebben we f(n) = Ө(g(n)) als en alleen als f(n) = O(g(n)) and f(n) = Ω(g(n)) .

Grafische Ω-notatie kan als volgt worden weergegeven:

Ω-notatie

Laten we bijvoorbeeld f(n) = 3n^2 + 5n - 4 . Dan f(n) = Ω(n^2) . Het is ook correct f(n) = Ω(n) , of zelfs f(n) = Ω(1) .

Een ander voorbeeld om een perfect matching-algoritme op te lossen: als het aantal vertices oneven is, voer dan "No Perfect Matching" uit, probeer anders alle mogelijke overeenkomsten.

We zouden willen zeggen dat het algoritme exponentiële tijd vereist, maar in feite kunt u geen Ω(n^2) ondergrens bewijzen met de gebruikelijke definitie van Ω omdat het algoritme in oneven tijd in lineaire tijd loopt. We moeten in plaats daarvan f(n)=Ω(g(n)) definiëren door te zeggen voor een constante c>0 , f(n)≥ cg(n) voor oneindig veel n . Dit geeft een mooie overeenkomst tussen de boven- en ondergrenzen: f(n)=Ω(g(n)) iff f(n) != o(g(n)) .

Referenties

Formele definitie en stelling zijn ontleend aan het boek "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Inleiding tot algoritmen".

Vergelijking van de asymptotische notaties

Laten f(n) en g(n) twee functies zijn die zijn gedefinieerd op de set van de positieve reële getallen, c, c1, c2, n0 zijn positieve reële constanten.

schrijfwijze f (n) = O (g (n)) f (n) = Ω (g (n)) f (n) = Θ (g (n)) f (n) = o (g (n)) f (n) = ω (g (n))
Formele definitie ∃ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ f(n) ≤ cg(n) ∃ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ cg(n) ≤ f(n) ∃ c1, c2 > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ c1 g(n) ≤ f(n) ≤ c2 g(n) ∀ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ f(n) < cg(n) ∀ c > 0, ∃ n0 > 0 : ∀ n ≥ n0, 0 ≤ cg(n) < f(n)
Analogie tussen de asymptotische vergelijking van f, g en reële getallen a, b a ≤ b a ≥ b a = b a < b a > b
Voorbeeld 7n + 10 = O(n^2 + n - 9) n^3 - 34 = Ω(10n^2 - 7n + 1) 1/2 n^2 - 7n = Θ(n^2) 5n^2 = o(n^3) 7n^2 = ω(n)
Grafische interpretatie O-notatie Ω-notatie Θ-notatie

De asymptotische notaties kunnen als volgt in een Venn-diagram worden weergegeven: Asymptotische notaties

Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Inleiding tot algoritmen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow