Maybaygiare.org

Blog Network

Amortiseret analyse

dynamisk arrayEdit

amortiseret analyse af push-operationen for et dynamisk array

overvej et dynamisk array, der vokser i et dynamisk array tørrelse som flere elementer tilføjes til det, såsom ArrayListi Java eller STD::vektor I C++. Hvis vi startede med et dynamisk array af størrelse 4, kunne vi skubbe 4 elementer på det, og hver operation ville tage konstant tid. Alligevel ville det tage længere tid at skubbe et femte element på det array, da arrayet skulle oprette et nyt array med dobbelt den aktuelle størrelse (8), kopiere de gamle elementer til det nye array og derefter tilføje det nye element. De næste tre push-operationer ville ligeledes tage konstant tid, og derefter ville den efterfølgende tilføjelse kræve en anden langsom fordobling af array-størrelsen.

generelt, hvis vi overvejer et vilkårligt antal skubber n + 1 til en array af størrelse n, bemærker vi, at push-operationer tager konstant tid bortset fra den sidste, der tager prisT ( n ) {\displaystyle \Theta (n)}

\Theta (n)

tid til at udføre størrelsesdoblingsoperationen. Da der var n + 1 operationer i alt, kan vi tage gennemsnittet af dette og finde ud af, at skubbe elementer på det dynamiske array tager: n-ret ( 1) + – ret ( n) – n + 1 = – Ret ( 1 ) {\displaystyle {\tfrac {n\Theta (1)+ – Theta (N)}{n+1}}=\Theta (1)}

{\displaystyle {\Tfrac {n\Theta (1)+ - Theta (n)}{n+1}}=\Theta (1)}

, konstant tid.

Køedit

vist er en Ruby-implementering af en kø, en FIFO-datastruktur:

class Queue def initialize @input = @output = end def enqueue(element) @input << element end def dequeue if @output.empty? while @input.any? @output << @input.pop end end @output.pop endend

forespørgselsoperationen skubber bare et element på inputarrayet; denne handling afhænger ikke af længderne af hverken input eller output og kører derfor i konstant tid.

imidlertid er afkøoperationen mere kompliceret. Hvis outputarrayet allerede har nogle elementer i det, kører dekeue i konstant tid; ellers tager dekeue O(n ) {\displaystyle O(n)}

O (n)

tid til at tilføje alle elementerne til outputarrayet fra inputarrayet, hvor n er den aktuelle længde af inputarrayet. Efter kopiering n elementer fra input, kan vi udføre n afkø operationer, hver tager konstant tid, før output array er tom igen. Således kan vi udføre en sekvens af N dekueoperationer i kun O ( n ) {\displaystyle O(n)}

O(n)

tid, hvilket indebærer, at den amortiserede tid for hver dekueoperation er O ( 1 ) {\displaystyle O(1)}

O(1)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.