Second Largest Element: Nabla Programmieraufgabe!

Bei Postings zu Algorithmus X lassen Sie Ihren Betreff bitte mit
"X: " beginnen, bei allgemeinen Postings zu Nabla bitte mit "Nabla: ", jeweils gefolgt von einer möglichst präzisen Überschrift, danke!

Moderator: Algorithmen und Datenstrukturen

Forumsregeln
Bei Postings zu Algorithmus X lassen Sie Ihren Betreff bitte mit
"X: " beginnen, bei allgemeinen Postings zu Nabla bitte mit "Nabla: ", jeweils gefolgt von einer möglichst präzisen Überschrift, danke!
Hallo
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 22. Apr 2015 19:03

Second Largest Element: Nabla Programmieraufgabe!

Beitrag von Hallo » 24. Aug 2016 16:00

Hallo, bei mir laufen gerade 3/11 Test durch.
Hat jemand vielleicht eine Idee was hier schief läuft?

Ich würde, bei der for-Schleife den Setter von setSecElem() anders schreiben, das der den richtig setzt, denn bis jetzt setzt er immer den alten secElement von den 1. und 2. if-statement. Ich habe aber keine Idee, wie ich das anders schreibe, sodass er es aktualisiert. (Da ja getSecElem()
von diesen Abschnitt hier abhängt:

Code: Alles auswählen

if(getComp().compare(first, second) > 0){
        	max = first;
        	setLargest(0);
        	secMax = second;
        	setSecLargest(1);
            }
     
        if(getComp().compare(first, second) < 0){
        	max = second;
        	setLargest(1);
        	secMax = first;
        	setSecLargest(0);
            }

Kompletter Code:

Code: Alles auswählen

{    
    T max= null;
    T secMax=null;
    if(getListLength() < 2) {return -1;}

    T first = getListElem(0);
    T second = getListElem(1);
    
    if(getComp().compare(first, second) > 0){
        	max = first;
        	setLargest(0);
        	secMax = second;
        	setSecLargest(1);
            }
     
        if(getComp().compare(first, second) < 0){
        	max = second;
        	setLargest(1);
        	secMax = first;
        	setSecLargest(0);
            }
                 
    int counter=0;
    for(int i=2; i<getListLength(); i++){
    
        T elem = getListElem(i);
    	if(elem == null){
    	continue;}

    	    if(getComp().compare(elem, max) > 0){
    	    	secMax = max;
    	    	setSecLargest(secMax);
    	    	max =elem;
    	    	setLargest(getLargest());
    	    }
    	    else { if(getComp().compare(elem, secMax) > 0){
    	    	 
    	    	  secMax = elem;
    	    	  setSecLargest(getSecLargest());
    	    	
    	    	}
    	    	else if(getComp().compare(elem, max) == 0){
    					if(counter == 1){
    					continue;}
    					secMax = max;
    					setSecLargest(getSecLargest());
    					max = elem;
    					setLargest(getLargest());
    					counter++;
    	    }
    	    }
    }
    	         
            
    
    
    return getSecLargest();
}
Würde mich auf eure Hilfe echt freuen. :)

joerg
Erstie
Erstie
Beiträge: 14
Registriert: 21. Sep 2015 19:15

Re: Second Largest Element: Nabla Programmieraufgabe!

Beitrag von joerg » 24. Aug 2016 21:41

Diese Zuweisungen stimmen nicht:
setSecLargest(getSecLargest());
setLargest(getLargest());

Müsste
setSecLargest(getLargest());
und
setLargest(i);
sein.

Benutzeravatar
sqrt(2)
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 202
Registriert: 12. Apr 2015 11:35

Re: Second Largest Element: Nabla Programmieraufgabe!

Beitrag von sqrt(2) » 25. Aug 2016 13:39

. :oops:
Zuletzt geändert von sqrt(2) am 26. Aug 2016 08:47, insgesamt 2-mal geändert.

Hallo
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 162
Registriert: 22. Apr 2015 19:03

Re: Second Largest Element: Nabla Programmieraufgabe!

Beitrag von Hallo » 25. Aug 2016 14:16

joerg hat geschrieben:Diese Zuweisungen stimmen nicht:
setSecLargest(getSecLargest());
setLargest(getLargest());

Müsste
setSecLargest(getLargest());
und
setLargest(i);
sein.
Das habe ich komplett übersehen..wusste das da irgendwas falsch ist. Dankeschön.
Jetzt laufen 6/11 Tests durch :P

arman
Neuling
Neuling
Beiträge: 6
Registriert: 4. Sep 2016 17:30

Re: Second Largest Element: Nabla Programmieraufgabe!

Beitrag von arman » 4. Sep 2016 17:35

Hallo,

Ich habe nun 10/11 Tests bestanden, kann mir jemand mit dem letzten helfen?

Code:

Code: Alles auswählen

public int searchSecondlargestElement()
{
    int length = getListLength();
    
    if(length<1)
        return -1;
        
    setLargest(0);
    
    for(int i = 1; i < length; i++) {
        if(getListElem(i)!=null) {
            if(getListElem(getLargest())==null) {
                setLargest(i);
                continue;
            }
            
            int cmp = getComp().compare(getListElem(i), getListElem(getLargest()));
            
            if(cmp > 0) {
                setSecLargest(getLargest());
                setLargest(i);
            } else if (cmp==0) {
                setSecLargest(i);
            } else if (cmp < 0) {
                if(getSecLargest()==-1) {
                    setSecLargest(i);
                    continue;
                }
                cmp = getComp().compare(getListElem(i), getListElem(getSecLargest()));
                if(cmp>0) {
                    setSecLargest(i);
                }
            }
        }
    }
    
    return getSecLargest();
}
Test:
Testheadder – dynamicTest_result(array.search.tests_searchSecondlargestElement.SearchSecondlargestElementTests)
Message – You didn't find the right position of the element.

edit: Ich weiß dass die Komplexität derzeit nicht stimmt..

Gruß

Benutzeravatar
Malou
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 19. Jun 2016 17:54

Re: Second Largest Element: Nabla Programmieraufgabe!

Beitrag von Malou » 13. Sep 2016 19:05

Hey,

Mit der Übung habe ich auch Probleme. Und zwar kommen bei mir drei Timeout error. Da sind bestimmt welche Fehler in meinem Code, aber ich wollte auch mal fragen, ob im Junit Test nicht ein Fehler ist. Ich vermute es, weil ich ein leeren Code compiliert habe, um die Fehler Nachrichten zu lesen, bin aber überraschend auf folgende Timeout error zugetreten:

Failurereport

Testheadder – dynamicTest_steps(array.search.tests_searchSecondLargestElement.SearchSecondlargestElementTests)

Message – test timed out after 2000 milliseconds

Habt ihr den Fehler auch?!

Falls ihr gleichzeitig mein Code kurz anschauen könnt und mir eventuelle Fehler korrigieren, wäre es auch nett. :lol:

Code: Alles auswählen

public void searchSecondLargestElement(){

	// Falls das Array der Länge 1 oder leer ist, wird -1 zurückgeliefert
	if(getLength()<=1){
        	setSecLargest(-1);
        	return;
   	 }
   	 
   	// Falls es null Werten am Anfang des Arrays gibt, überspringe die und initialisiere Largest mit dem ersten Wert != null vom Array
    	int pos = 0;
   	while(getElem(pos) == null){ 
        	pos++;
    	}
    	if(pos<getLength()){
        	setLargest(pos);
    	}
    	
    	// Initialisiere SecLargest mit -1
    	setSecLargest(-1);
    	for(int i = pos+1; i< getLength(); i++){
        	if(getElem(i) != null){
            		int cmp = getComp().compare(getElem(i), getElem(getLargest()));
            		
            		// Falls das i-ten Element des Arrays grösser als das Maximum ist, setzte es als Maximum und ersetze SecLargest mit dem alten Max. 
            		if(cmp>=0){
                		setSecLargest(getLargest());
                		setLargest(i);
            		}
            		// Falls es kleiner ist und grösser als SecLargest, ersetze secLargest damit.
            		else if(getSecLargest() == -1 
                 		|| getComp().compare(getElem(i), getElem(getSecLargest()))>0){
                		setSecLargest(i);
            		}
        }
    }

Antworten

Zurück zu „AuD: Arbeit mit Nabla“