38
Rekursive Funktionen I Beispiel f¨ ur das “Skelett” einer rekursiven Funktion: rek(... ) { ... // Block 1 rek(... ) ... // Block 2 rek(... ) ... // Block 3 }

Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Embed Size (px)

Citation preview

Page 1: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen ausI den Kosten aller Blocke t =

∑i Bi // “aktuelle” Kosten

I den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 2: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen aus

I den Kosten aller Blocke t =∑

i Bi // “aktuelle” KostenI den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 3: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen ausI den Kosten aller Blocke t =

∑i Bi // “aktuelle” Kosten

I den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 4: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen ausI den Kosten aller Blocke t =

∑i Bi // “aktuelle” Kosten

I den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 5: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen ausI den Kosten aller Blocke t =

∑i Bi // “aktuelle” Kosten

I den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 6: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursive Funktionen

I Beispiel fur das “Skelett” einer rekursiven Funktion:

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

I Die Kosten fur einen Aufruf an rek bestehen ausI den Kosten aller Blocke t =

∑i Bi // “aktuelle” Kosten

I den Kosten aller rekursiven Aufrufe.

I Wie konnen wir die Gesamtkosten ubersichtlich bestimmen?

Rekursionsbaume zeigen die Struktur eines rekursiven Algos

Page 7: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 8: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 9: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 10: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

}

......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 11: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ...

......

...

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 12: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ...

......

...

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 13: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 14: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 15: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 16: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

...

...

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 17: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

...

...

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 18: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 19: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 20: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Rekursionsbaume

rek(. . . ){

. . . // Block 1rek(. . . ). . . // Block 2rek(. . . ). . . // Block 3

} ......

......

t0

t1 t2

t3 t4 t5 t6

I fur jeden Aufruf genau ein Knoten // Wurzel ≡ erster Aufruf

I v ′ ist i-tes Kind von v ⇔ Aufruf von v ′ ist i-ter Aufruf aus v

I Knotenmarkierungen: aktuelle Kosten tj =∑

i Bi des Aufrufs

I Gesamtkosten: Summe aller aktuellen Kosten t =∑

j tj .

Page 21: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechts

I Wie ist die Hohe h des Baums?I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 22: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechts

I Wie ist die Hohe h des Baums?I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 23: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechts

I Wie ist die Hohe h des Baums?I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 24: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechts

I Wie ist die Hohe h des Baums?I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 25: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 26: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.

I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 27: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert.

Wann also gilt ( 12 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.

I Die Gesamtkosten sind∑

j tj = h ·Θ(1) = Θ(log2 |A|).

Page 28: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1?

Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 29: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.

I Die Gesamtkosten sind∑

j tj = h ·Θ(1) = Θ(log2 |A|).

Page 30: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum der binaren Suchebs(A, s): // Suche s im sortierten Array A{

falls A leer ist: return NICHT DA

m = A[“Mitte”]falls s < m:

return bs(linke Halfte von A, s)falls m < s:

return bs(rechte Halfte von A, s)falls m = s:

return VORHANDEN}

Θ(1)

Θ(1)

...

Θ(1)

I die Kosten aller Blocke sind unabhangig von der Grosse von A;sie benotigen insgesamt konstante Laufzeit Θ(1)

I immer nur ein rekursiver Aufruf // entw. links oder rechtsI Wie ist die Hohe h des Baums?

I Nur noch ein rek. Aufruf sobald A nur noch ein Element hat.I Die Lange wird stets halbiert. Wann also gilt ( 1

2 )h · |A| = 1? Gdw. |A| = 2h ⇔ h = log2 |A|.I Die Gesamtkosten sind

∑j tj = h ·Θ(1) = Θ(log2 |A|).

Page 31: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 32: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 33: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 34: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 35: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 36: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).

Page 37: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .

= n + n + n + · · · = h · n = O(n log2 n).

Page 38: Rekursive Funktionen - Professur für Theoretische ... · Der Rekursionsbaum der bin aren Suche bs(A;s): // Suche s im sortierten Array A f falls A leer ist: return NICHT DA m= A[\Mitte"]

Der Rekursionsbaum von MergeSortmergesort(A): // A habe Lange n

wenn A hochstens 1 Schlussel hat: return // schon sortiertmergesort(linke Halfte von A)mergesort(rechte Halfte von A)

mische beide sortierten Halften, so dass A sortiert ist

......

. . .

. . .

n

n2

n2

n4

n4

n4

n4

2

1 1

2

11

// alle aktuellen Kosten verstehen sich in “Θ” geklammert

I Stets genau zwei rekursive Aufrufe.

I Arraylange n: Mischen in Zeit Θ(n) // Ubungsaufgabe

I Die Hohe des Baums ist h = log2 n.// analog zu binarer Suche

I Die Gesamtkosten sind∑

j tj ≈ n + 2 · n2 + 4 · n4 + . . .= n + n + n + · · · = h · n = O(n log2 n).