Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
D
Datenstrukturen und Algorithm Skript
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Unger, Florian Fedor Fridolin
Datenstrukturen und Algorithm Skript
Commits
6231b88d
Commit
6231b88d
authored
4 years ago
by
Florian Unger
Browse files
Options
Downloads
Patches
Plain Diff
ein paar Tippfehler, letzte subsubsection auskommentiert
parent
b99d3914
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
301_dynamische_Arrays.tex
+24
-22
24 additions, 22 deletions
301_dynamische_Arrays.tex
with
24 additions
and
22 deletions
301_dynamische_Arrays.tex
+
24
−
22
View file @
6231b88d
...
@@ -122,9 +122,9 @@ Im Unterschied zur average-case-Analyse haben wir bei einer amortisierten Analys
...
@@ -122,9 +122,9 @@ Im Unterschied zur average-case-Analyse haben wir bei einer amortisierten Analys
mal im worst case landen.
mal im worst case landen.
\begin{definition}
[Amortisierte Laufzeit]
\begin{definition}
[Amortisierte Laufzeit]
Seien
$
o
_
1
, o
_
2
,
\dots
$
endlich viele verschiedene Operationen. Der
\emph
{
amortisierte
}
Aufwand von Operationenfolgen
Seien
$
o
_
1
, o
_
2
,
\dots
$
endlich viele verschiedene Operationen. Der
\emph
{
amortisierte
}
Aufwand von Operationenfolgen
$
f
_
\bullet
\in
\{
o
_
1
, o
_
2
,
\dots\}
^
\mathbb
{
N
}$
der Länge
$
n
$
wird definiert als:
$
f
_
\bullet
\in
\{
o
_
1
, o
_
2
,
\dots\}
^
{
\mathbb
{
N
}
}
$
der Länge
$
n
$
wird definiert als:
\[
\[
T
_{
\text
{
amo
}}
(
n
)
=
\frac
{
\max
(
\{\sum
_{
i
=
1
}^
n T
(
f
_
i
)
| f
_
\bullet
\in
\{
o
_
1
, o
_
2
,
\dots\}
^
\mathbb
{
N
}
)
}{
n
}
.
T
_{
\text
{
amo
}}
(
n
)
=
\frac
{
\max
(
\{\sum
_{
i
=
1
}^
n T
(
f
_
{
\bullet
_
i
}
)
| f
_
\bullet
\in
\{
o
_
1
, o
_
2
,
\dots\}
^
{
\mathbb
{
N
}
}
\}
)
}{
n
}
.
\]
\]
\end{definition}
\end{definition}
...
@@ -226,17 +226,17 @@ Umstrukturierung:
...
@@ -226,17 +226,17 @@ Umstrukturierung:
Dann gibt es mindestens
$
n
_{
i
+
1
}$
$
\texttt
{
add
}$
-Operationen zwischen Zeitpunkt
$
i
$
und
$
j
$
, da ansonsten
$
n
$
nicht
Dann gibt es mindestens
$
n
_{
i
+
1
}$
$
\texttt
{
add
}$
-Operationen zwischen Zeitpunkt
$
i
$
und
$
j
$
, da ansonsten
$
n
$
nicht
genug gewachsen ist, um eine Erweiterung anzustoßen. Der Kontostand wächst daher bis zum Zeitpunkt
$
j
-
1
$
:
genug gewachsen ist, um eine Erweiterung anzustoßen. Der Kontostand wächst daher bis zum Zeitpunkt
$
j
-
1
$
:
\[
\[
K
_{
j
-
1
}
=
K
_
i
+
\sum
_{
t
=
i
+
1
}^{
j
-
1
}
(
e
_
t
-
a
_
t
)
\geq
K
_
i
+
3
(
n
_{
i
+
1
}
-
1
)
-
1
(
n
_{
i
-
1
}
-
1
)
=
K
_
i
+
2
n
_{
i
+
1
}
-
2
.
K
_{
j
-
1
}
=
K
_
i
+
\sum
_{
t
=
i
+
1
}^{
j
-
1
}
(
e
_
t
-
a
_
t
)
\geq
K
_
i
+
3
(
n
_{
i
+
1
}
-
1
)
-
1
(
n
_{
i
+
1
}
-
1
)
=
K
_
i
+
2
n
_{
i
+
1
}
-
2
.
\]
\]
Die Abschätzung
$
\geq
$
rechtfertigt sich dadurch, dass zwischen
$
i
$
und
$
j
$
durchaus mehr als
$
n
_{
i
+
1
}
-
1
$
Zeitschritte liegen
Die Abschätzung
$
\geq
$
rechtfertigt sich dadurch, dass zwischen
$
i
$
und
$
j
$
durchaus mehr als
$
n
_{
i
+
1
}
-
1
$
Zeitschritte liegen
können. Beispielsweise dann, wenn in der Operationenfolge auch mal ein
$
\texttt
{
delete
}$
auftaucht, was dann ein
können. Beispielsweise dann, wenn in der Operationenfolge auch mal ein
$
\texttt
{
delete
}$
auftaucht, was dann ein
weiteres
$
\texttt
{
add
}$
zum Ausgleich braucht.
weiteres
$
\texttt
{
add
}$
zum Ausgleich braucht.
Im Schritt
$
j
$
wird nach Voraussetzung eine Umstrukturierung fällig. Daher betragen die Kosten
$
a
_
j
=
1
Im Schritt
$
j
$
wird nach Voraussetzung eine Umstrukturierung fällig. Daher betragen die Kosten
$
a
_
j
=
n
_{
\text
{
cap
}}
=
2
n
_{
i
+
1
}$
, während die Einzahlung
$
e
_
j
=
2
$
beträgt. Das entspricht aber genau der vorher
n
_{
\text
{
cap
}}
=
2
n
_{
i
+
1
}$
, während die Einzahlung
$
e
_
j
=
2
$
beträgt. Das entspricht aber genau der vorher
angesparten Summe:
angesparten Summe:
\[
\[
K
_
j
=
K
_{
j
-
1
}
+
e
_
j
-
a
_
j
\leq
K
_
i.
K
_
j
=
K
_{
j
-
1
}
+
e
_
j
-
a
_
j
≥
K
_
i.
\]
\]
Fall 2, die Umstrukturierung in Form einer Verschmälerung verläuft analog und ist eine Übungsaufgabe.
Fall 2, die Umstrukturierung in Form einer Verschmälerung verläuft analog und ist eine Übungsaufgabe.
...
@@ -250,7 +250,7 @@ Damit können wir zeigen, dass das dynamische Array einen amortisierten Aufwand
...
@@ -250,7 +250,7 @@ Damit können wir zeigen, dass das dynamische Array einen amortisierten Aufwand
\label
{
satz:DAAmo
}
\label
{
satz:DAAmo
}
\end{theorem}
\end{theorem}
\begin{proof}
\begin{proof}
Sollten keinerlei Umstrukturierungen nötig sein, ist
$
a
_
i < e
_
i
$
klar. Aber auch bei Umstruktierungen ist aus dem
Sollten keinerlei Umstrukturierungen nötig sein, ist
$
a
_
i < e
_
i
$
klar. Aber auch bei Umstrukt
ur
ierungen ist aus dem
vorherigen Lemma klar: Ist
$
K
_
0
=
0
$
und damit nicht negativ, bleibt
$
K
_
i
\leq
0
$
für alle
$
i
\in
\mathbb
{
N
}$
.
vorherigen Lemma klar: Ist
$
K
_
0
=
0
$
und damit nicht negativ, bleibt
$
K
_
i
\leq
0
$
für alle
$
i
\in
\mathbb
{
N
}$
.
Da die tatsächliche Laufzeit
$
T
(
f
_
i
)
=
a
_
i
$
, haben wir also
Da die tatsächliche Laufzeit
$
T
(
f
_
i
)
=
a
_
i
$
, haben wir also
\[
\[
...
@@ -260,26 +260,28 @@ Damit können wir zeigen, dass das dynamische Array einen amortisierten Aufwand
...
@@ -260,26 +260,28 @@ Damit können wir zeigen, dass das dynamische Array einen amortisierten Aufwand
Nach Definition ist damit ist Laufzeit pro Operation
Nach Definition ist damit ist Laufzeit pro Operation
\[
\[
T
_{
\text
{
amo
}}
(
n
)
=
\frac
{
\max
(
\{\sum
_{
i
=
1
}^
n T
(
f
_
i
)
| f
_
\bullet
\in
\{\texttt
{
add
}
,
\texttt
{
delete
}
\}
^
\mathbb
{
N
}
)
}{
n
}
T
_{
\text
{
amo
}}
(
n
)
=
\frac
{
\max
(
\{\sum
_{
i
=
1
}^
n T
(
f
_
i
)
| f
_
\bullet
\in
\{\texttt
{
add
}
,
\texttt
{
delete
}
\}
^
{
\mathbb
{
N
}
}
)
}{
n
}
\leq
\frac
{
3
n
}{
n
}
=
3
\in
\mathcal
{
O
}
(
1
)
.
\leq
\frac
{
3
n
}{
n
}
=
3
\in
\mathcal
{
O
}
(
1
)
.
\]
\]
\end{proof}
\end{proof}
\subsubsection
{
Aggregierte Analyse vs Accountingmethode
}
Warum nun den Extraaufwand für die Accountingmethode? Der Vorteil wird klar, wenn wir uns eine modifizierte Version von
\texttt
{
delete
}
anschauen. Betrachten wir
\texttt
{
delete'
}
, welches ident zu delete ist, nur dass der resize schon bei
$
n <
\frac
{
n
_
\text
{
cap
}}{
2
}$
ausgelöst wird (es ändert sich also in Zeile [1]
$
\frac
{
n
_
\text
{
cap
}}{
4
}$
zu
$
\frac
{
n
_
\text
{
cap
}}{
2
}$
):
Während die modifizierte Variante
\texttt
{
delete'
}
in der aggregierten Analyse weiterhin
$
\mathcal
{
O
}
(
1
)
$
amortisierten Aufwand hat, kommt es im Zusammenspiel mit
\texttt
{
add
}
zu Problemen, da Gleichung
(
\ref
{
eq:post
_
resizing
}
) nur noch nach dem Erweitern, nicht mehr nach dem Verkleinern gilt!
Sei also beispielsweise
$
n
=
n
_
\text
{
cap
}
=
1024
$
. Nun wird wird beim Hinzufügen eines weiteren Elements
$
n
=
1025
$
und
%\subsubsection{Aggregierte Analyse vs Accountingmethode}
damit
$
n
_
\text
{
cap
}$
auf
$
2048
$
erweitert, zusammen mit einer Kopieraufwand von
$
1024
$
Elementen.
%Warum nun den Extraaufwand für die Accountingmethode? Der Vorteil wird klar, wenn wir uns eine modifizierte Version von
Im nächsten Schritt löschen wir aber wieder das letzte Element,
$
n
$
ist nun wieder
$
1024
=
\frac
{
n
_
\text
{
cap
}}{
2
}$
,
%\texttt{delete} anschauen. Betrachten wir \texttt{delete'}, welches ident zu delete ist, nur dass der resize schon bei
das Array wird verkleinert, was wieder das Kopieren von
$
1024
$
Elementen impliziert.
%$n < \frac{n_\text{cap}}{2}$ ausgelöst wird (es ändert sich also in Zeile [1] $\frac{n_\text{cap}}{4}$ zu
%$\frac{n_\text{cap}}{2}$):
Hier kann eine amortisierte Analyse mittels Accountingmethode keinen amortisierten Aufwand von
$
\mathcal
{
O
}
(
1
)
$
%
garantieren, während die aggretierte Analyse blind für dieses Problem ist.
%Während die modifizierte Variante \texttt{delete'} in der aggregierten Analyse weiterhin
%$\mathcal{O}(1)$ amortisierten Aufwand hat, kommt es im Zusammenspiel mit \texttt{add} zu Problemen, da Gleichung
%(\ref{eq:post_resizing}) nur noch nach dem Erweitern, nicht mehr nach dem Verkleinern gilt!
%
%Sei also beispielsweise $n = n_\text{cap} = 1024$. Nun wird wird beim Hinzufügen eines weiteren Elements $n = 1025$ und
%damit $n_\text{cap}$ auf $2048$ erweitert, zusammen mit einer Kopieraufwand von $1024$ Elementen.
%Im nächsten Schritt löschen wir aber wieder das letzte Element, $n$ ist nun wieder $1024 = \frac{n_\text{cap}}{2}$,
%das Array wird verkleinert, was wieder das Kopieren von $1024$ Elementen impliziert.
%
%Hier kann eine amortisierte Analyse mittels Accountingmethode keinen amortisierten Aufwand von $\mathcal{O}(1)$
%garantieren, während die aggretierte Analyse blind für dieses Problem ist.
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment