Laufzeit von einfachem Programm

DaSt

Bekanntes Mitglied
Hallo,
wir sollen ein Algorithmus eintwickeln mit Laufzeit n^3, einen der schneller ist als n^3 und einen mit nlogn der folgende Aufgabe erfüllt.
Eingabe: int a[] = {a0; : : : ; an-1}; (Nur ganze positive Zahlen ohne 0)
Ausgabe: true, falls es zwei Elemente ai; aj gibt mit s = ai + aj ; i != j, false sonst

Ich verstehe es so, dass wenn es eine Zahl s im Array gibt die das Erg. der Addition zweier anderer Zahlen im Array ist, dann true sonst false

Mit Laufzeit n^3 habe ich folgendes implementiert
Java:
//Laufzeit n^3
    public static void LaufZeitNhochDrei(int arr[]){
       
        for(int i =0; i<arr.length; i++){
            for(int j=i+1; j<arr.length; j++){
                int erg =0;
                erg =arr[i]+arr[j];
                 //Jedes mögliche Additionsergebnis mit den Werten im Array vergleichen
                for(int y=0; y<arr.length;y++){
                    if(arr[y]==erg){
                        System.out.println("True: " +erg +" = " +arr[i]+" + "+arr[j]);
                    }
                }
            }   
        }
    }

Ist folgender Code schneller? Hat ja nur 2 verschachtelte For-Schleifen
Ist hier die Laufzeit n^2+n korrekt?(2 verschachtelte For-Schleifen + eine normale)
Aber ich weiss halt nicht wie list.add() bzw. list.contains() implementiert sind
Java:
//Laufzeit n^2+n
    public static void LaufZeitNhochzwei(int arr[]){
        //In diese Liste werden alle einzelnen Ergebnisse der Additionen gespeichert
        ArrayList<Integer> list = new ArrayList<Integer>();
       
        //Berechnen aller möglichen Ergebnisse und speichern in die Liste
        for(int i=0; i<arr.length; i++){
            for(int j =i+1; j<arr.length; j++){
                int erg =0;
                erg=arr[i]+arr[j];
                list.add(erg);
            }
        }
       
        //Prüfen ob es ein Element gibt, dass sowohl in der Liste als auch im
        //ursprünglichen Array vorkommt
        for(int y =0; y<arr.length;y++){
            if(list.contains(arr[y])){
                System.out.println("True");
                break;
            }
        }
       
        System.out.println("In der Liste befinden sich folgende Elemente "+list.toString());
       
    }

Mit nlogn hab ich noch keine Idee

Danke
 

DaSt

Bekanntes Mitglied
Was ist denn s?
Denkst du nur, das es aus dem Array stammt, oder ist es so vorgegeben?

Es heisst ja in der Angabe "Ausgabe: true, falls es zwei Elemente ai; aj gibt mit s = ai + aj ; i != j, false sonst"
Ich habe es so verstanden, dass wenn es im Array eine Zahl S gibt die sich aus der Addition von zwei anderen Zahlen im Array bilden lässt, dann liefere True
 

mrBrown

Super-Moderator
Mitarbeiter
Ich les daraus, das ein festes s gegeben ist, was nicht im Array liegt, sonst wäre es sicher als a_k oä gegeben...
 

JStein52

Top Contributor
Trotz allem denke ich dass die Lösung mit list.contains(...) keine gültige Lösung ist. Ich denke mal ihr sollt hier einen Algorithmus angeben und nicht einen "anonymen" Methodenaufruf ...
 

mrBrown

Super-Moderator
Mitarbeiter
Trotz allem denke ich dass die Lösung mit list.contains(...) keine gültige Lösung ist. Ich denke mal ihr sollt hier einen Algorithmus angeben und nicht einen "anonymen" Methodenaufruf ...
Ob man sich da jetzt selber was bastelt oder Listen benutzt ist doch ziemlich egal und ändert an der Laufzeit nichts...Datenstrukturen wie Listen werden meistens als gegeben vorausgesetzt wenns um Algorithmen geht
 

DaSt

Bekanntes Mitglied
Wenn ich keine Liste benutze,kann ich die Werte(der Additionen) ja auch einfach in ein hilfsarray schreiben und dann zum schluss dieses Hilfsarray wieder mit dem orginal Array mittels 2er verschachtelten for-schleifen vergleichen. Somit hätte ich dann doch eine Laufzeit von 2*n^2 und wäre immer noch schneller als n^3
 

JStein52

Top Contributor
Ob man sich da jetzt selber was bastelt oder Listen benutzt ist doch ziemlich egal und ändert an der Laufzeit nichts
Es ändert nichts an der Laufzeit, ist aber transparent was geschieht. Und wir könnten noch diskutieren ob ArrayList, HashMap, Set oder sonst noch was.
Wenn ich keine Liste benutze,kann ich die Werte(der Additionen) ja auch einfach in ein hilfsarray schreiben und dann zum schluss dieses Hilfsarray wieder mit dem orginal Array mittels 2er verschachtelten for-schleifen vergleichen.
Genau. Könntest du
 

stg

Top Contributor
Was ist denn s?
Denkst du nur, das es aus dem Array stammt, oder ist es so vorgegeben?

Wenn s kein Element des Arrays sein soll, sondern fest vorgegeben wird, dann würde mir nicht einfallen, wie man die Problemlösung (nicht künstlich) so aufblähen könnte, um auf kubische Laufzeit zu kommen. Ist s fest vorgeben, so ist das Problem zudem in linearer Zeit lösbar. Daher schließe ich einfach mal, dass s aus dem Array stammen soll. Die Frage lautet also vermutlich: Gibst es ein s \in {0,...,n-1} mit a_i + a_j = a_s (usw...)
(wobei ich mich da gerade frage, ob das tatsächlich in quasi-linearer Zeit lösbar ist. Mein erster Ansatz jedenfalls taugte nichts....)
 
Zuletzt bearbeitet:

stg

Top Contributor
Vermutlich ist dann doch s fest vorgegeben und Lösungen mittels Hashing o.Ä. sind nicht angedacht.
Dann jedenfall erstmal sortieren. Anschließend von links nach rechts übers array laufen und für jedes Element mittels binärer Suche das "Komplement" suchen.
 

mrBrown

Super-Moderator
Mitarbeiter
Dann jedenfall erstmal sortieren. Anschließend von links nach rechts übers array laufen und für jedes Element mittels binärer Suche das "Komplement" suchen.
Das wäre auch meine Lösung gewesen. Für s in a würde mir zumindest keine "einfache" Lösung in O(n logn) einfallen. Je nach Intervall der Zahlen könnte man was countingsort-ähnliches nehmen, dann wärs linear
 

DaSt

Bekanntes Mitglied
Ich habe heute nochmal den Prof. gefragt wie es genau gemeint war.
Man das s stammt nicht aus dem Array sondern wird per Hand eingegeben und dann soll überprüft werden ob sich diese Zahl s aus zwei Zahlen des Arrays darstellen lässt.
Als Tipp sagte er uns wir sollen die Zahlen zuerst mit einem sortieralgorithmus der die Laufzeit nlogn hat sortieren und dann werden wir schon sehen wie es weitergeht. Da kämpfe ich gerade noch etwas damit
 

stg

Top Contributor
Wo dran genau? Dem Sortieren?

Für den Fall das s vorgegeben ist hast du hier ja schon Lösungvorschläge bekommen (siehe z.B. mein Beitrag #11) . Wenn da etwas unklar ist, dann musst du nochmal genauer nachfragen.
 

DaSt

Bekanntes Mitglied
nein das sortieren ist mir klar, aber wie ich das dann prüfen soll (in höchstens nlogn) verstehe ich nicht und an deiner Lösung ist das einzige was ich verstehe dass es da eine For-Schleife gibt. Wieso wird bei einem so rießigen long wert gestartet, was heisst
Java:
l >>=5
oder
Java:
(((l & 31 | 64) % 95) + 32))

und wie hilft das weiter um zu prüfen ob sich S aus zwei Zahlen Ai bzw. Aj aus dem Array darstellen lässt?
 

mrBrown

Super-Moderator
Mitarbeiter
nein das sortieren ist mir klar, aber wie ich das dann prüfen soll (in höchstens nlogn) verstehe ich nicht und an deiner Lösung ist das einzige was ich verstehe dass es da eine For-Schleife gibt. Wieso wird bei einem so rießigen long wert gestartet, was heisst
Das ist keine Lösung, das ist seine Signatur ;)
 

stg

Top Contributor
ohh gott, ja klar:)
was die binäre suche ist weiss ich aber was ist mit dem kompliment gemeint?

Beispiel s=10
Im sortierten Array ist das erste Element nun etwa 1. Nun musst du mit binärer Suche schauen, ob es eine 9 gibt. Falls ja, bist du fertig. Falls nein fahre mit dem zweiten Element fort. usw...

Allgemein für das Element an Stelle i schaust du, ob dein Array ein Element mit dem Wert s-arr[i] gibt. Der Wert s-arr[i] ist das, was ich mit Komplement zu arr[i] meinte.[/i][/i][/i]
 

fhoffmann

Top Contributor
Wenn das Array sortiert ist, sollte es auch so gehen (ungetestet):
Java:
int unten = 0;
int oben = arr.length - 1;
while (unten <= oben) {
    int summe = arr[unten] + arr[oben];
    if (summe == s) {
        return true;
    }
    if (summe < s) {
        unten++;
    } else {
        oben--;
    }
}
return false;
 

DaSt

Bekanntes Mitglied
Ich habe es nun so probiert wie @stg es mir geraten hat und es funktioniert, soweit ich es getestet habe

Java:
public static boolean binaereSuche(int arr[], int suche){
        int rechts = arr.length-1;
        int links=0;
       
        while(links <= rechts){
           
            int mitte = (links +rechts)/2;
           
            if(arr[mitte] < suche){
                links = mitte +1;
            }
            else if(arr[mitte] > suche){
                rechts = mitte -1;
            }
            else{
                return true;
            }
           
        }
       
        return false;
    }
   
   
   
    public static boolean summeEnthalten(int arr[], int s){
       
        for(int i =0; i< arr.length; i++){
            if(binaereSuche(arr, s-arr[i])){
                return true;
            }
        }
       
        return false;
       
    }

Vielen Dank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
W Array zur Laufzeit bearbeiten? Java Basics - Anfänger-Themen 31
D Objekterzeugungen mit zur Laufzeit variierenden Attributen Java Basics - Anfänger-Themen 7
J GroupLayout zur Laufzeit erweitern Java Basics - Anfänger-Themen 1
B Übersetzungszeit und Laufzeit Java Basics - Anfänger-Themen 3
amgadalghabra Die vier Sortieralgorithmen die durchschnittliche Laufzeit in Millisekunden Java Basics - Anfänger-Themen 37
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
L Anzahl der Elemente key in einem Array mit log(N) Laufzeit Java Basics - Anfänger-Themen 4
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
H Laufzeit Java Basics - Anfänger-Themen 11
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
L Objekt Typ zur Laufzeit ermitteln Java Basics - Anfänger-Themen 1
J Datei im Package zur Laufzeit editieren Java Basics - Anfänger-Themen 1
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 5
M Quicksort Laufzeit langsam Java Basics - Anfänger-Themen 0
R Objekte zur Laufzeit in Schleife erzeugen und in ArrayList ablegen Java Basics - Anfänger-Themen 4
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
M Input/Output Datei in Laufzeit-JAR kopieren Java Basics - Anfänger-Themen 6
V Laufzeit Java Basics - Anfänger-Themen 23
G Laufzeit/ O/Θ-Notation einer Treeset Methode Java Basics - Anfänger-Themen 0
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
M Erste Schritte Code zur Laufzeit ändern lassen Java Basics - Anfänger-Themen 3
C Klassen aus einem Package ermitteln und per Laufzeit laden Java Basics - Anfänger-Themen 17
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
K JLabel zur Laufzeit dynamisch erzeugen Java Basics - Anfänger-Themen 7
M Methoden miteinander verbinden (Laufzeit) Java Basics - Anfänger-Themen 6
llabusch Interface Layout eines Labels während der Laufzeit ändern Java Basics - Anfänger-Themen 0
Streeber reale Laufzeit meines Programms ausgeben Java Basics - Anfänger-Themen 1
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
S Klassentyp zur Laufzeit ändern? Java Basics - Anfänger-Themen 3
M Laufzeit und O-Notation Java Basics - Anfänger-Themen 3
M Variablen Variable zur Laufzeit erzeugen Java Basics - Anfänger-Themen 3
A Laufzeit von verschachtelter for-Schleife Java Basics - Anfänger-Themen 4
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
L Panels zur Laufzeit ändern Java Basics - Anfänger-Themen 2
A Laufzeit Java Basics - Anfänger-Themen 11
M Methodennamen zur Laufzeit ausgeben Java Basics - Anfänger-Themen 5
F JTable zur laufzeit füllen Java Basics - Anfänger-Themen 7
P GUI - Layout per Laufzeit erstellen/verändern? Java Basics - Anfänger-Themen 6
N Variablen VariableNamen auswirkung auf Laufzeit Java Basics - Anfänger-Themen 3
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
J Erste Schritte Zinseszinsberechnung Ermittlung Laufzeit Java Basics - Anfänger-Themen 3
S Laufzeit bei rekursiver Methode messen Java Basics - Anfänger-Themen 6
S Erste Schritte Weihnachtsbaum / Laufzeit O(n) Java Basics - Anfänger-Themen 9
E Laufzeit verkürzen Java Basics - Anfänger-Themen 14
A Threads Zur Laufzeit hinzufügen/entfernen Java Basics - Anfänger-Themen 10
D Classpath compiler zur Laufzeit aufrufen & lib-classpath Java Basics - Anfänger-Themen 6
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
B Laufzeit berechnen? Java Basics - Anfänger-Themen 7
S Klasse bei Laufzeit laden? Java Basics - Anfänger-Themen 2
B Klassen Objekte während der Laufzeit dynamisch anlegen Java Basics - Anfänger-Themen 8
K jButton zur Laufzeit hinzufügen Java Basics - Anfänger-Themen 22
D globale Variablen zur Laufzeit erzeugen Java Basics - Anfänger-Themen 5
A Frage zur Laufzeit / Optimierung Java Basics - Anfänger-Themen 2
N Laufzeit in Nanosekunden - in Minuten umrechnen Java Basics - Anfänger-Themen 6
alderwaran objekthierarchie darstellen während der laufzeit Java Basics - Anfänger-Themen 2
G Objekte von Klassen die erst zur Laufzeit bekannt sind erstellen Java Basics - Anfänger-Themen 6
B Frage zur Laufzeit Java Basics - Anfänger-Themen 2
Luk10 Variablen zur Laufzeit ändern! Java Basics - Anfänger-Themen 7
G JAR zur Laufzeit nachladen Java Basics - Anfänger-Themen 2
S JDialog resize zur Laufzeit PROBLEM!!! Java Basics - Anfänger-Themen 5
E Pfad zu einem gif-Bild wird zur Laufzeit nicht gefunden Java Basics - Anfänger-Themen 5
A Applet Bild zu laufzeit hinzufügen Java Basics - Anfänger-Themen 4
C Frage zu Syntax-,Laufzeit-, Semantikfehler Java Basics - Anfänger-Themen 3
R JVM zur laufzeit manipulieren? Java Basics - Anfänger-Themen 4
S Zur Laufzeit Strings Compilieren Java Basics - Anfänger-Themen 5
A Objekte während der Laufzeit erstellen Java Basics - Anfänger-Themen 3
A Objektzugriff zur Laufzeit ändern Java Basics - Anfänger-Themen 20
G Text eines JLabels zur Laufzeit ändern Java Basics - Anfänger-Themen 4
M Laufzeit von Programmen Java Basics - Anfänger-Themen 3
A Jar-Archive zur Laufzeit erstellen Java Basics - Anfänger-Themen 3
G Zu Laufzeit von Tastatur einlesen Java Basics - Anfänger-Themen 11
E Einen String auch über die Laufzeit hinaus speichern Java Basics - Anfänger-Themen 4
A Neue Objekte zur Laufzeit erzeugen Java Basics - Anfänger-Themen 5
D Locale zur Laufzeit über JComboBox laden? Java Basics - Anfänger-Themen 17
S Ausdruck zur Laufzeit auswerten Java Basics - Anfänger-Themen 10
G Anzahl Textfelder zur Laufzeit verändern. Java Basics - Anfänger-Themen 4
Z Benutzerdaten währen Laufzeit speichern Java Basics - Anfänger-Themen 2
K JProgressbar, zur laufzeit steuern Java Basics - Anfänger-Themen 7
V Vektoren zur Laufzeit erzeugen Java Basics - Anfänger-Themen 7
N zur Laufzeit gefundene class-Datei verwenden - wie geht das? Java Basics - Anfänger-Themen 2
G Look and Feel zur Laufzeit ändern Java Basics - Anfänger-Themen 2
A Text einer JComboBox während der Laufzeit ändern ? Java Basics - Anfänger-Themen 4
K Chart zur Laufzeit erstellen und aktualisieren Java Basics - Anfänger-Themen 2
G JAR: Externe Dateien zur Laufzeit aufrufen Java Basics - Anfänger-Themen 12
C Variablen zur Laufzeit erstellen? Java Basics - Anfänger-Themen 14
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
M JButton zur laufzeit erzeugen/ löschen Java Basics - Anfänger-Themen 3
B Laufzeit und Übersetzungszeit Java Basics - Anfänger-Themen 11
H ComboBox zur Laufzeit erzeugen? Fehler. Java Basics - Anfänger-Themen 8
M Java Heap Space während der Laufzeit ändern Java Basics - Anfänger-Themen 2
M Klassen zur Laufzeit laden, aus einer jar heraus. Java Basics - Anfänger-Themen 14
A classpath zur Laufzeit erweitern Java Basics - Anfänger-Themen 4
G Anpassen einer JComboBox zur Laufzeit Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben