[Java] Frage zur Laufzeitbestimmung

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von powernator, 25. April 2012 .

Schlagworte:
  1. 25. April 2012
    Zuletzt bearbeitet: 25. April 2012
    Frage zur Laufzeitbestimmung

    Hallo,

    ich bin auf folgende Funktion gestoßen, die eine längste nicht fallende Teilfolge ausgibt:
    Code:
     public static LinkedList<Integer> getLS(int[] X) {
     int[] Y = X.clone();
     Arrays.sort(Y);
     
     int[][] L = new int[X.length+1][Y.length+1];
     int[][] B = new int[X.length+1][Y.length+1];
     // For B, say 0 = Up, 1 = Left, 2 = UpLeft
     for (int i = 1; i <= X.length; i++) {
     for (int j = 1; j <= Y.length; j++) {
     if (X[i-1] == Y[j-1]) {
     L[i][j] = L[i-1][j-1] + 1;
     B[i][j] = 2;
     } else if (L[i-1][j] >= L[i][j-1]) {
     L[i][j] = L[i-1][j];
     B[i][j] = 0;
     } else {
     L[i][j] = L[i][j-1];
     B[i][j] = 1;
     }
     }
     }
     
     LinkedList<Integer> result = new LinkedList<Integer>();
     
     int i = X.length, j = Y.length;
     while (i > 0 && j > 0) {
     if (B[i][j] == 2) {
     result.addFirst(X[i-1]);
     i--;
     j--;
     } else if (B[i][j] == 0) {
     i--;
     } else {
     j--;
     }
     }
     
     return result;
     }
    (source: http://www.ucc.asn.au/~dictator/wiki/LongestIncreasingSequence)

    Ich bin gerade dabei, den Algorithmus zu verstehen und frage mich nun aber, ob das tatsächlich in O(n²) abläuft, wie auf der Seite angegeben? Vielleicht ist das ganz einfach, aber mit Laufzeiten habe ich noch meine Probleme ...

    Code:
     for (int i = 1; i <= X.length; i++) {
     for (int j = 1; j <= Y.length; j++) {
     // ...
     }
     }
    // ...
     int i = X.length, j = Y.length;
     while (i > 0 && j > 0) {
     // ...
     }
    Das sind die entscheidenden Sachen für die Laufzeit, korrekt?
    Die verschachtelten for-Schleifen liegen bereits in O(n²) (ist das nicht sogar Theta(n²)?), jetzt kommt aber noch die while-Schleife hinzu, im worst case läuft diese 2n (wenn immer abwechselnd i und j verringert werden). Dann wäre die gesamte Laufzeit O(n² + 2n) = O(n²)?

    Vielen Dank schonmal
     
  2. 25. April 2012
    AW: Frage zur Laufzeitbestimmung

    Entscheidend für die Laufzeit ist alles. Aber die erste Schleife ist die für die Laufzeit relevanteste (weil die Zweite ja größenordnungsmäßig kleiner ist).
    Ob die erste Schleife in Theta liegt kann ich dir nicht sagen ist schon was länger her. Aber mit der Gleichung hast du recht. Da n² eine Größenordnung größer ist, als das n (konstante Faktoren sind das irrlevenateste überhaupt^^) ist die Gesamtlaufzeit von der Größenordnung O(n²)
     
    1 Person gefällt das.
  3. 25. April 2012
    Zuletzt bearbeitet: 25. April 2012
    AW: Frage zur Laufzeitbestimmung

    Korrekt.


    Auch richtig. Theta(n²) ist zum Beispiel a*n² + b*n. In der Praxis aber eher unrelevant da einen ja eher die kleinste obere Schranke in Form des O-Kalküls interessiert.


    Richtig, du hast das ja schon alles richtig interpretiert, ich wäre zu demselben Schluss gekommen.
     
    1 Person gefällt das.
  4. 25. April 2012
    Zuletzt bearbeitet: 25. April 2012
    AW: Frage zur Laufzeitbestimmung

    Ok sehr gut, demzufolge ändert
    Code:
     Arrays.sort(Y);
    auch nichts an O(n²), da java.util.Arrays.sort einen "modifizierten Mergesort" benutzt, also sagen wir mal, dass es in O(n * log n) liegt, das wäre insgesamt dann O( (n*log n) + n² + 2n ) = O(n²) - korrekt?

    Ist im Grunde das selbe wie mit der while-Schleife, aber will nichts verwechseln, daher zur Sicherheit nochmal die Nachfrage

    EDIT:/ Danke für die beiden Antworten, bws habt ihr!
     
  5. 25. April 2012
    AW: Frage zur Laufzeitbestimmung

    The sorting algorithm is a tuned quicksort, adapted from Jon L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function", Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November 1993). This algorithm offers n*log(n) performance on many data sets that cause other quicksorts to degrade to quadratic performance.

    Kein Merge sondern Quicksort, aber ansonsten richtig.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.