• Keine Ergebnisse gefunden

Universität Bremen

N/A
N/A
Protected

Academic year: 2022

Aktie "Universität Bremen"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

1

Universität Bremen

Suchen

Thomas Röfer Flache/Tiefe Gleichheit Lineare Suche Binäre Suche Asymptotische Komplexität

2

Universität Bremen

PI-2: Suchen

Grundschema

Rückblick „Algorithmenkonstruktion“

Beweis rekursiver Algorithmen

( ) ⋅ (−)

= =

sonst 1

0 falls 1

n factorial n n n factorial

Induktions- anfang

Induktions- schritt

Beweis iterativer Algorithmen

Hamburg München Freiburg

Hamburg München Freiburg Hamburg München Freiburg

Freiburg München Hamburg Freiburg München Hamburg München Hamburg Freiburg München Hamburg Freiburg

Hamburg München Freiburg Hamburg München Freiburg München Hamburg Freiburg München Hamburg Freiburg Freiburg München Hamburg Freiburg München Hamburg

Hamburg Freiburg München Hamburg Freiburg München München Freiburg Hamburg München Freiburg Hamburg Freiburg Hamburg München Freiburg Hamburg München

Rundreiseproblem Top-down / bottom-up

fn1 fn2 fn3 fn4

prog

Greedy / Divide and Conquer

3

Universität Bremen

PI-2: Suchen

Gleichheit

Identität

Es handelt sich um dasselbe Objekt

In Java: == für Referenzen Flache Gleichheit

Alle Elemente zweier Objekte sind

„flach“ gleich

In Java: == für alle Elemente der Objekte

class List {

List next;

int value;

boolean shallowEquals(List other) {

return other != null &&

value == other.value &&

next == other.next;

} } classList {

List next;

intvalue;

booleanshallowEquals(List other) {

returnother != null&&

value == other.value &&

next == other.next;

} }

1 1 null null 1 1 null null a

b

a != b && a.shallowEquals(b)

1 1 null null a

b a == b

4

Universität Bremen

PI-2: Suchen

Gleichheit

Tiefe Gleichheit

Alle Elemente zweier Objekte sind

„tief“ (rekursiv) gleich In Java: equals() auf Objekten, wenn equals() für alle beteiligten Klassen geeignet definiert ist

equals()

in Klasse Object entspricht nur ==, muss also überschrieben werden

class List {

List next;

int value;

boolean equals(List other) {

return other != null &&

value == other.value &&

(next == other.next ||

next != null &&

next.equals(other.next));

} } classList {

List next;

intvalue;

booleanequals(List other) {

returnother != null&&

value == other.value &&

(next == other.next ||

next != null&&

next.equals(other.next));

} }

!a.shallowEquals(b) && a.equals(b) 1 1

1 1 a b

2 2 null null 2 2 null null

5

Universität Bremen

PI-2: Suchen

Tiefe Kopie

Ziel

Erstellen einer vollständigen Kopie, die unabhängig vom Original ist

In Java

Die Klasse Object enthält bereits eine Funktion clone()zu diesem Zweck Sie erzeugt aber nur eine CloneNotSupportedException, es sei denn, eine Klasse implementiert die Schnittstelle Cloneable

Implementierung

Cloneableimplementieren In clone()

Neues Objekt erstellen Alle Basistypen-Attribute kopieren Für alle Objekt-Attribute wiederum clone()aufrufen

class List implements Cloneable {

List next;

int value;

public Object clone() {

List copy = new List();

copy.value = value;

if(next != null)

copy.next = (List) next.clone();

return copy;

} }

classList implementsCloneable {

List next;

intvalue;

publicObject clone() {

List copy = newList();

copy.value = value;

if(next != null)

copy.next = (List) next.clone();

returncopy;

} }

6

Universität Bremen

PI-2: Suchen

Lineare Suche

Voraussetzungen

Suche in Reihung oder Liste Gleichheit der Elemente muss definiert sein

Ansatz

Vergleiche Suchwert der Reihe nach mit allen Elementen der Reihung/Liste

Komplexität

Bester Fall: Erstes Element ist das gesuchte

Schlechtester Fall: Das gesuchte Element ist nicht vorhanden

Im Mittel wird die halbe Reihung oder Liste durchsucht

int linearSearch(Object[] a, Object key) {

int i = 0;

while(i < a.length &&

!a[i].equals(key)) ++i;

return i == a.length ? -1 : i;

}

intlinearSearch(Object[] a, Object key) {

inti = 0;

while(i < a.length &&

!a[i].equals(key)) ++i;

returni == a.length ? -1 : i;

}

(2)

2

7

Universität Bremen

PI-2: Suchen

Lineare Suche mit Wächter/Stopper

Ansatz

Gesuchtes Element wird ans Ende der Reihung/Liste gestellt, damit es auf jeden Fall gefunden wird Dadurch entfällt der Vergleich mit der Länge der Reihung/Liste Nachteile

Vorbereitung dauert länger Für Listen nur sinnvoll, wenn man direkten Zugriff auf das Ende hat Reihung/Liste wird zeitweilig verändert, mögliche Probleme bei paralleler Ausführung

int guardSearch(Object[] a, Object key) {

Object last = a[a.length - 1];

if(last == key) return a.length - 1;

else {

a[a.length - 1] = key;

int i = 0;

while(!a[i].equals(key)) ++i;

a[a.length - 1] = last;

return i == a.length - 1 ? -1 : i;

} }

intguardSearch(Object[] a, Object key) {

Object last = a[a.length - 1];

if(last == key) returna.length - 1;

else {

a[a.length - 1] = key;

inti = 0;

while(!a[i].equals(key)) ++i;

a[a.length - 1] = last;

returni == a.length - 1 ? -1 : i;

} }

8

Universität Bremen

PI-2: Suchen

Lineare Suche ohne Längentest

Grund

Java prüft ohnehin die Gültigkeit eines Index bzw. einer Referenz Ansatz

Nicht auf Länge testen Java-Ausnahme fangen Nachteile

Erzeugung und Fangen von Ausnahme kostet Zeit

int exceptionSearch(Object[] a, Object key) {

try {

int i = 0;

while(!a[i].equals(key)) ++i;

return i;

}

catch(ArrayIndexOutOfBoundsException e) {

return -1;

} }

intexceptionSearch(Object[] a, Object key) {

try {

inti = 0;

while(!a[i].equals(key)) ++i;

returni;

}

catch(ArrayIndexOutOfBoundsException e) {

return-1;

} }

9

Universität Bremen

PI-2: Suchen

Ordnungsrelationen

Definition

Eine Ordnungsrelation definiert eine Ordnung zwischen Elementen eines Typs

Typische Ordnungsrelationen sind

<und >

Ordnungsrelationen sind transitiv:

a > b /\ b > c a > c Dadurch können Werte auch implizit miteinander verglichen werden Eine Ordnung kann über allen Typen definiert werden, ist aber nicht immer intuitiv

Äpfel > Birnen?

In Java

Operatoren <, >, <=, >=für alle Basistypen außer boolean Methode compareTo()in Schnittstelle Comparable

void test(Comparable a, Comparable b) {

switch(a.compareTo(b)) {

case -1:

System.out.println("a < b");

break;

case 0:

System.out.println("a == b");

break;

case 1:

System.out.println("a > b");

break;

} }

voidtest(Comparable a, Comparable b) {

switch(a.compareTo(b)) {

case-1:

System.out.println("a < b");

break;

case0:

System.out.println("a == b");

break;

case1:

System.out.println("a > b");

break;

} }

10

Universität Bremen

PI-2: Suchen

Binäre Suche

Voraussetzungen Suche in Reihung Ordnungsrelation muss für Elemente definiert sein Elemente müssen entsprechend der Ordnungsrelation sortiert sein Ansatz

Divide and Conquer Durch Sortierung muss nicht mit allen Elementen verglichen werden

int binarySearch(Comparable[] a, Comparable key) {

if(a.length == 0) return -1;

else {

int bottom = 0, top = a.length;

while(bottom + 1 != top) {

int mid = (top + bottom) / 2;

if(a[mid].compareTo(key) > 0) top = mid;

else bottom = mid;

}

return a[bottom].equals(key)

? bottom : -1;

} }

intbinarySearch(Comparable[] a, Comparable key) {

if(a.length == 0) return-1;

else {

intbottom = 0, top = a.length;

while(bottom + 1 != top) {

intmid = (top + bottom) / 2;

if(a[mid].compareTo(key) > 0) top = mid;

else bottom = mid;

}

returna[bottom].equals(key)

? bottom : -1;

} }

11

Universität Bremen

PI-2: Suchen

Binäre Suche – Beispiel

1 5 8 9 11

1 2 3 4 5 0

top bottom

int binarySearch(Comparable[] a, Comparable key) {

if(a.length == 0) return -1;

else {

int bottom = 0, top = a.length;

while(bottom + 1 != top) {

int mid = (top + bottom) / 2;

if(a[mid].compareTo(key) > 0) top = mid;

else bottom = mid;

}

return a[bottom].equals(key)

? bottom : -1;

} }

intbinarySearch(Comparable[] a, Comparable key) {

if(a.length == 0) return-1;

else {

intbottom = 0, top = a.length;

while(bottom + 1 != top) {

intmid = (top + bottom) / 2;

if(a[mid].compareTo(key) > 0) top = mid;

else bottom = mid;

}

returna[bottom].equals(key)

? bottom : -1;

} }

9?

mid

1 2 3 4 5 0 1 5 8

9 11

bottom top mid

1 2 3 4 5 0 1 5 8

9 11

top bottom

mid

1 2 3 4 5 0 1 5 8

9 11

top bottom

12

Universität Bremen

PI-2: Suchen

Komplexität

Definition

Die Komplexität eines Algorithmus ist die Anzahl der benötigten Programmschritte (der Aufwand) in Abhängigkeit von der Größe der Eingabe Arten

Zeitkomplexität

ist üblicherweise mit „Komplexität“ gemeint

Platzkomplexität

Zu betrachtende Fälle Schlechtester Fall (worst case) Bester Fall (best case)

Durchschnittlicher Fall (average case)

int sqr(int x) {

return x * x;

}

int factorial(int n) {

return n > 0 ? factorial(n – 1) : 1;

} intsqr(intx) {

returnx * x;

}

intfactorial(intn) {

returnn > 0 ? factorial(n – 1) : 1;

}

(3)

3

13

Universität Bremen

PI-2: Suchen

Exakte Bestimmung – Multiplikationen

int f1(int n) {

int res = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

return res;

}

intf1(intn) {

intres = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

returnres;

} 3 1 6 5 3

1 0 3 3 2

0 0 1 1 2

I(n) M(n) V(n) Z(n)

10 9 8 7 6 5

45 36 55 47

36 28 45 38

28 21 36 30

21 15 28 23

15 10 21 17

10 6 15 12

6 3 10 8 4

2 ) 2 )(

1 (

) 4 ( ) 3 ( ) 2 (

) 1 ( ) 2 ( ) (

2

1

= −

=

− +

− +

=

− +

=

=

n n

k

n M n n

n M n n M

n

k

2 ) 2 )(

1 (

) 4 ( ) 3 ( ) 2 (

) 1 ( ) 2 ( ) (

2

1

= −

=

− +

− +

=

− +

=

=

n n

k

n M n n

n M n n M

n

k

14

Universität Bremen

PI-2: Suchen

Exakte Bestimmung – Inkremente

2 ) 1 (

) 1 ( 1 ) 2 ( ) (

1

1

= −

=

− + +

=

=

n n

k n I n n I

n

k

2 ) 1 (

) 1 ( 1 ) 2 ( ) (

1

1

= −

=

− + +

=

=

n n

k n I n n I

n

k 3

1 6 5 3

1 0 3 3 2

0 0 1 1 2

I(n) M(n) V(n) Z(n)

10 9 8 7 6 5

45 36 55 47

36 28 45 38

28 21 36 30

21 15 28 23

15 10 21 17

10 6 15 12

6 3 10 8 4

int f1(int n) {

int res = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

return res;

}

intf1(intn) {

intres = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

returnres;

}

15

Universität Bremen

PI-2: Suchen

Exakte Bestimmung – Zuweisungen

3 1 6 5 3

1 0 3 3 2

0 0 1 2 1

I(n) M(n) V(n) Z(n)

10 9 8 7 6 5

45 36 55 47

36 28 45 38

28 21 36 30

21 15 28 23

15 10 21 17

10 6 15 12

6 3 10 8 4

2 ) 1 2 (

) ( 1 1 ) (

+ −

= + +

= n n

n I n Z

2 ) 1 2 (

) ( 1 1 ) (

+ −

= + +

= n n

n I n Z

int f1(int n) {

int res = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

return res;

}

intf1(intn) {

intres = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

returnres;

}

16

Universität Bremen

PI-2: Suchen

2 ) 1 (

) 1 ( ) (

1

= +

=

− +

=

=

n n

k n V n n V

n

k

Exakte Bestimmung – Vergleiche

3 1 6 5 3

1 0 3 3 2

0 0 1 2 1

I(n) M(n) V(n) Z(n)

10 9 8 7 6 5

45 36 55 47

36 28 45 38

28 21 36 30

21 15 28 23

15 10 21 17

10 6 15 12

6 3 10 8 4

2 ) 1 (

) 1 ( ) (

1

= +

=

− +

=

=

n n

k n V n n V

n

k int f1(int n) {

int res = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

return res;

}

intf1(intn) {

intres = 1;

for(int j = 1; j < n; ++j) for(int i = 1; i < j; ++i)

res = res * i;

returnres;

}

) ( ) ( ) ( ) ( )

( n M n I n V n Z n

G = + + +

17

Universität Bremen

PI-2: Suchen

Asymptotische Komplexität

Definition

Sei

Die Ordnung von f ist die Menge

O(f(n)) charakterisiert das Wachstum von f Sie enthält alle Funktionen, deren Graph maximal so stark wächst wie der Graph von f

bis auf Umbezeichnung der Einheiten auf der y- Achse

Beispiel

f(n) = 1/3 n² t1(n) = ¼ n² t2(n) = n t3(n) = 1/3 n² + 2 t4(n) = 2n

∈O(f(n)), n0= 1, c = 1

∈O(f(n)), n0= 3, c = 1

∈O(f(n)), n0= 3, c = 2

∉O(f(n))

18

Universität Bremen

PI-2: Suchen

Beweise

n² ∈ ∈ ∈ ∈ O(n³) ?

Zu zeigen: und so dass für alle n > n

0

gilt: n²

c · n³ Dies gilt z.B. ab c = 1, n

0

= 1

n³ ∈ ∈ ∈ ∈ O(n²) ?

Zu zeigen: und so dass für alle n > n

0

gilt: n³

c · n² Dies erfordert ein c, so dass für alle n gilt: n ≤ c

Ein solches c kann es nicht geben, daher gilt: n³

O(n²) Weitere Aussagen

O(f(n) + g(n)) = O(max{f(n), g(n)}) O(f(n)) ⊆ O(g(n)) ⇔ f(n) ∈ O(g(n))

O(f(n)) = O(g(n)) ⇔f(n) ∈ O(g(n)) /\ g(n) ∈ O(f(n))

O(f(n)) ⊂ O(g(n)) ⇔ f(n) ∈ O(g(n)) /\ g(n) ∉ O(f(n))

(4)

4

19

Universität Bremen

PI-2: Suchen

Typische Aufwandsklassen

O(1) Z.B. sqr() O(log n)

Z.B. binarySearch(), n = a.length O(n)

Z.B. linearSearch(), n = a.length O(n log n)

Sortieren mit Divide and Conquer O(n²), O(n³) …

f1 (Folie 13ff) O(2

n

), O(3

n

), … O(n!)

Rundreiseproblem

Referenzen

ÄHNLICHE DOKUMENTE

In this paper we show that uniformly global asymptotic stability for a family of ordinary dierential equations is equivalent to uniformly global exponential stability under a

MouseListener MouseAdapter mouseEntered, mousePressed, mouseReleased, mouseClicked, mouseExited MouseMotionListener MouseMotionAdapter mouseDragged, mouseMoved. MouseWheelListener

Damit die Objekte einer Klasse später auch in Collections (Datenstrukturen – wie Arrays, nur komfortabler) verwendet werden können, muss daneben für die Methoden equals()

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method

”Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that a ff

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method

Declarative &amp; Model-based Specifications Declarative specifications just specify which properties hold, they do not say anything about how the holding is achieved. In

Advanced Aspects of Object-Oriented Programming (SS 2011) Practice Sheet 1 Date of Issue: 19.04.11. Deadline: - (until 10 a.m. Note: Have a look at the Java API documentation of