Rekursion oder Iteration - verkettete Listen

Jake?!

Mitglied
Hallo,

Mir ist heute eine Frage in den Sinn gekommen, die Rekursion und Iteration betrifft. Ich habe 2 Methoden geschrieben, eine rekursiv, die andere iterativ, um Elemente an eine Warteschlange, also eine einfach verkettete FIFO-Liste anzuhaengen. (Wie wird das eigentlich ausgesprochen? F-I-F-O oder fiefoh?) Ausserdem habe ich noch eine dritte Methode geschrieben, die vermutlich besser als beide vorherigen ist, jedoch interessieren mich die beiden vorherigen trotzdem. Hier erstmal der Quellcode:
Java:
public class List 			//Beginn der Liste, zeigt auf ersten Knoten
{
	private Node next;				//Zeiger auf ersten bzw. auf den naechsten Knoten
	private List currentNode;		//Zeiger, der immer auf den "aktuellen" Knoten zeigt, wichtig fuer 3. Implementierung
	
	public List()			
	{
		this.currentNode = this;
	}
	
	public Node getNext()	//Methode fuer die Testklasse
	{
		return next;
	}
	
	public void appendRec(Node n)	//Die rekursive Methode
	{
		if (next != null)
			next.appendRec(n);
		else
			next = n;
	}
	
	public void appendIt(Node n)	//Die 1. iterative Methode
	{
		List localCurrent = this;
		while (localCurrent.next != null)
		{
			localCurrent = localCurrent.next;
		}
		localCurrent.next = n;
	}
	
	public void append3(Node n)		//Die 3. Methode,
	{									//liesse sich mit leichter Modifikation vermutlich
		currentNode.next = n;			//auch gut fuer LIFO-Stacks verwenden
		currentNode = currentNode.next;
	}
	
}


public class Node extends List		//Als Subklasse von List implementiert, um die Methoden einfacher implementieren zu koennen
{
	private String element;
	public Node(String e)
	{
		this.element = e;
	}
	
	public void print()				//Methode fuer die Testklasse
	{
		System.out.println(element);
	}
}


public class TestList 	//Eine kleine Testklasse
{
	public static void main(String args[])
	{
		List list1 = new List();
		List list2 = new List();
		List list3 = new List();
		
		String i = new String("1");
		String ii = new String("2");
		String iii = new String("3");
		
		list1.appendRec(new Node(i));
		list1.appendRec(new Node(ii));
		list1.appendRec(new Node(iii));
		
		list2.appendIt(new Node(i));
		list2.appendIt(new Node(ii));
		list2.appendIt(new Node(iii));
		
		list3.append3(new Node(i));
		list3.append3(new Node(ii));
		list3.append3(new Node(iii));
		
		list1.getNext().print();
		list1.getNext().getNext().print();
		list1.getNext().getNext().getNext().print();
		
		list2.getNext().print();
		list2.getNext().getNext().print();
		list2.getNext().getNext().getNext().print();
		
		list3.getNext().print();
		list3.getNext().getNext().print();
		list3.getNext().getNext().getNext().print();
	}
}

Scheint soweit alles zu funktionieren. Wenn ich die Landau-Notation richtig verstanden habe (kann durchaus sein, dass das nicht der Fall ist), dann hat die dritte Methode eine Laufzeit von O(1) und ist damit kaum zu toppen.

Da sind jedoch noch die ersten beiden Methoden. Also eine kleine Fallunterscheidung.

Gilt jeweils fuer einen Methodenaufruf bei der rekursiven oder einen Schleifendurchlauf bei der iterativen Methode:

Falls Zeiger.next != null:
rekursiv: 1 Abfrage + 1 Methodenaufruf = 2
iterativ: 1 Abfrage + 1 Zuweisung = 2

Falls Zeiger.next == null:
rekursiv: 1 Abfrage + 1 Zuweisung = 2
iterativ: 1 Abfrage + 1 Zuweisung = 2

Fuer beide Methoden gilt (glaube ich) eine Laufzeit von O(n), n entspricht der Anzahl der Listenelemente. Damit sind sie deutlich langsamer als die 3. Methode, aber welche von den beiden ersten ist schneller? Dauert ein Methodenaufruf laenger als eine Zuweisung oder ist die iterative Methode sowieso aufgrund der geringeren (?) Arbeitsspeicherbelastung vorzuziehen?

Mir kommen rekursive Algorithmen immer ein wenig eleganter vor...

Vielen Dank fuer Antworten!

Jake
 
Zuletzt bearbeitet:

Dekker

Bekanntes Mitglied
Die dritte Methode ist die Performanteste. Wenn du immer ans Ende anfügst, merk dir das letzte Element. Die Rekursive und die Iterative Variante gehen beide, allerdings ist in Java die iterative Variante vorzuziehen. Java muss bei der Rekursion immer auf den Stack schreiben und bei einer Liste dir voll genug ist, kann es dann zu einem Stackoverflow kommen.
 

Jake?!

Mitglied
Alles klar, soweit schon mal danke!

bleibt nur noch die Frage (ja, ich weiß, für dieses Beispiel spielt es keine unglaublich große Rolle, aber es interessiert mich allgemein) ob ein Methodenaufruf länger dauert als eine Zuweisung

Jake
 
N

nillehammer

Gast
Dauert ein Methodenaufruf laenger als eine Zuweisung
Tendenzell ja. Eine Zuweisung ist nur das Speichern eines Werts (bei primitiven) oder einer Referenz (bei Objekten) in einem Speicherbereich, dem Du einen Namen gegeben hast. Methoden enthalten mindestens mehrere Opertationen manchmal sogar sehr Komplizierte.
oder ist die iterative Methode sowieso aufgrund der geringeren (?) Arbeitsspeicherbelastung vorzuziehen?
Im Sinne der Lesbarkeit des Codes ist Iteration meist vorzuziehen. Im Sinne der Arbeitsspeicherbelastung denke ich auch. Wobei man bestimmt Fälle finden kann, bei denen eine Rekursion weniger Arbeitsspeicher benötigt als eine Iteration.
 
Zuletzt bearbeitet von einem Moderator:

Denny1989

Aktives Mitglied
die 3. implementierung hat meiner meinung nach aber nichts mehr mit den ersten beiden zu tun, da du bei den ersten beiden immer den anfangspunkt deine kette im currentNode hast und bei der 3. variante immer den zu letzt geschriebenen node. was ja ein unterschied ist, deswegen hinkt hier der vergleich würde ich sagen. das verhält sich dann ja anders.
 

bERt0r

Top Contributor
Java:
currentNode.next = n;
currentNode = currentNode.next;
ist das selbe wie
Java:
x.next=n;
x=n;
Das schlechte an deiner Implementierung ist, dass sowohl in deiner List, als auch in deinen Nodes überall UNTERSCHIEDLICHE currentNode Zeiger sind, und die zeigen alle auf sich selbst - ausser bei dem Node/der List wo du deine appends aufrufst. Das ganze funktioniert solange du nicht auf irgendeine Node in der Mitte ein append3 machst, dann überschreibst du nämlich einfach das nächste Element.
 

Jake?!

Mitglied
@Denny: Das ist mir bewusst. Es ging auch primaer um den Vergleich von Methode #1 und #2, #3 habe ich hinzugefuegt damit, wenn ich schon zwei von der Laufzeit her suboptimale Methoden vergleiche, ich wenigstens eine schnelle Alternative habe.

@bERt0r: Stimmt, ich frage mich gerade warum mir das nicht aufgefallen ist... (bezogen auf das Codefragment)

immernoch @bERt0r: Hmm, vermutlich sollte ich Node nicht von List erben lassen... Das habe ich eigentlich fuer die rekursive Methode gemacht, aber fuer die andern liess es sich auch ganz gut nutzen, ich denke es wuerde trotzdem nicht schwer sein, das anders zu implementieren. Ich versuche es gleich mal. (Man koennte natuerlich auch mit instanceOf-Abfrage ueberpruefen, ob das Objekt, auf dem die Methode aufgerufen wird, eine List ist, aber das wuerde sich glaube ich nicht wirklich lohnen)

Jake

edit: OK, habs, die Methode ist zwar laenger, hat aber immernoch eine Laufzeit von O(1)
 
Zuletzt bearbeitet:

Denny1989

Aktives Mitglied
äh nochmal.

deine Laufzeit von 1 und das die #3 länger ist als die 1. und 2. spielt doch garkeine rolle wenn sie doch sowieso nicht das selbe tun und somit nciht zum gleichen ergebnis führen!? was macht ein vergleich da für einen sinn?
 

Jake?!

Mitglied
Irgendwo tun sie ja schon dasselbe, sie haengen ein Element an die Liste an... (Sie erreichen das Ziel nur auf unterschiedlichen Wegen, und es ist so gedacht, dass man die Methoden nur von einem List-Objekt aufruft)

Aber mir ging es ja auch nicht darum, #1 mit #3 oder #2 mit #3 zu vergleichen, sondern vorallem #1 mit #2.

Und falls du das hier meintest:

edit: OK, habs, die Methode ist zwar laenger, hat aber immernoch eine Laufzeit von O(1)

damit meinte ich, dass die Methode laenger als vorher ist, nicht laenger als #1 oder #2

Jake
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Rekursion Allgemeine Java-Themen 22
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
eQuest Rekursion Dauer Allgemeine Java-Themen 6
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
M Rückwärts geführte Rekursion Allgemeine Java-Themen 3
Schandro StackOverflowError bei Rekursion verhindern Allgemeine Java-Themen 14
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
AmsananKING String Iteration Allgemeine Java-Themen 5
H Input/Output Iteration in Feldern Allgemeine Java-Themen 8
M Normalized Iteration count funktioniert nicht. Wo ist mien Denkfehler? Allgemeine Java-Themen 6
B parallele / Multithreaded Iteration über Map Allgemeine Java-Themen 12
R Controlling Programm (Objekt-Iteration Problem) Allgemeine Java-Themen 9
O Verschachtelte Iteration: Innere Iteration abbrechen Allgemeine Java-Themen 3
W sortierte Iteration über Set oder Map, bzw. Collections Allgemeine Java-Themen 5
G Performante Array iteration Allgemeine Java-Themen 27
M doppelt verkettete Listen Allgemeine Java-Themen 2
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
K verkettete Liste Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
T Verkettete Suche Allgemeine Java-Themen 6
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
D Einfach verkettete Liste Allgemeine Java-Themen 3
R doppelt verkettete Liste: Fehler beim Einfügen Allgemeine Java-Themen 3
chik Doppelt verkettete Liste bzw. Zirkulärliste (kleiner Fehler, den ich nicht finde) Allgemeine Java-Themen 4
X einfach verkettete Liste und Insertion Sort Allgemeine Java-Themen 3
R Verkettete Liste Allgemeine Java-Themen 5
L Doppelt Verkettete Listen Allgemeine Java-Themen 6
E Verkettete Listen Allgemeine Java-Themen 5
F Doppelt verkettete Liste sortieren? Allgemeine Java-Themen 8
M doppelt verkettete Listen? Allgemeine Java-Themen 5
M Schlange als verkettete Liste Allgemeine Java-Themen 4
J Doppelt verkettete Liste Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben