Agenda

  • Intro
  • Problemfelder
  • Erwartungen an DSA
  • Landau-Notation
  • Fallbeispiel Problem

Intro

Was ist ein Algorithmus?

systematische Vorgehensweise zur Lösung eines Problems

Charakteristika

  • Finitheit
  • Ausführbarkeit
  • Dynamische Finitheit
  • Terminierung
  • Determiniertheit
  • Determinismus

Was ist eine Datenstruktur?

spezifische Anordung von Daten zur effizienten Verwaltung eines Problems

Charakteristika

  • statisch
  • dynamisch

Kann man Datenstrukturen und Algorithmen trennen?

Nein nur die Kombination bringt etwas.

Was bringt ein Array ohne (über)schreiben und lesen?

Was bringt eine for-Schleife ohne Array?

Unsere Definition von DSA

Ein Algorithmus (A) erzeugt, manipuliert und entfernt eine oder mehrere Datenstrukturen(DS) um ein spezifisches Problem effizient zu lösen.

Problemfelder

Prozessprobleme

  • Suche
  • Sortierung
  • Verarbeitung

Technische Probleme

  • Zeitkomplexität
  • Speicherkomplexität

Optimum

Das Optimum kann nur für ein Problemfeld für ein technisches Problem gefunden werden.

Es existiert kein Allgemeiner Algorithmus, der jedes Problem in der kürzesten Zeit mit der geringsten Speichermenge löst.

Demo - Performance von Suche und Verarbeitung

  • Erstellen einer HashMap & ArrayList
  • Suchen in einer HashMap & ArrayList
  • Löschen in einer HashMap & ArrayList

Erwartungen an DSA

Inhalte

  • Grundlegende Praktikable Datenstrukturen
  • Worst Case Szenario
  • keine Beweise
  • kaum Coding (von euch, da Projektbericht)
  • Einstieg in das Themengebiet

Landaunotation

wird auch Big-O Notation genannt

Landaunotation (Big-O)

wird verwendet um Algorithmen in Bezug auf Speicher- und Zeitanforderungen zu kategorisieren.

ist keine exakte Messung, sondern soll das Wachstum des Algorithmus generalisieren.

Warum brauchen Big-O?

Wenn wir wissen, welche Stärken und Schwächen ein Algorithmus hat, können wie den besten Algorithmus für unser Problem nutzen.

Ich benutz immer Big-O zum erklären

Was ist Big-O?

gibt an in welchem Verhältnis ein Algorithmus abhängig vom input in Bezug auf Laufzeit und Speicher wächst

Beispiel für Big-O

O(N)

  • 10 Elemente entspricht 10 Zeiteinheiten
  • 20 Elemente entspricht 20 Zeiteinheiten

Beispiel für Big-O

public class BigO {
  // O(N)
  public static void method(int[] n) {
    int sum = 0;
    for(int i = 0; i > n.length; i++) {
      sum += n[i];
    }
    return sum;
  }
}

Jahresgehalt eines Mitarbeiters

Beispiel für Big-O

public class BigO {
  // O(N²)
  public static void method(int[] n) {
    int sum = 0;
    for(int i = 0; i > n.length; i++) {
      for(int j = 0; j > n.length; j++) {
        sum += n[j];
      }
    }
    return sum;
  }
}

Jahresgehalt jedes Mitarbeiters einer Abteilung

Beispiel für Big-O

public class BigO {
  // O(N³)
  public static void method(int[] n) {
    int sum = 0;
    for(int i = 0; i > n.length; i++) {
      for(int j = 0; j > n.length; j++) {
        for(int k = 0; k > n.length; k++) {
          sum += n[k];
        }
      }
    }
    return sum;
  }
}

Jahresgehalt jedes Mitarbeiters jeder Abteilung

Big-O von diesem Code?

public class BigO {
  public static void method(int[] n) {
    int sum = 0;
    for(int i = 0; i > n.length; i++) {
      sum += n[i];
    }
    for(int i = 0; i > n.length; i++) {
      sum += n[i];
    }
    return sum;
  }
}

praktisch: O(2N) → O(N)

Warum O(N) anstatt O(2N)

NO(10N)O(N²)
1101
55025
100100010.000
100010.0001.000.000
10.000100.000100.000.000

Konstanten können ignoriert werden.

Big-O von diesem Code?

public class BigO {
  public static void method(int[] n) {
    int sum = 0;
    for(int i = 0; i > n.length; i++) {
      if(sum > 9876) {
        return sum;
      }
      sum += n[i];
    }
    return sum;
  }
}

O(N) → Worst-Case-Szenario

Unsere Regeln

  • Wachstum ist abhängig vom Input
  • Konstanten werden ignoriert
  • Worst-Case ist unser default

Fallbeispiel Problem