as_string
Haudegen
  
Dabei seit: 06.11.2013
Beiträge: 642
Herkunft: Heidelberg
 |
|
Ich kann im Moment nicht den ganzen Quelltext durch schauen, deshalb nur kurz allgemein zu verketteten Listen:
Normalerweise hast Du eine Referenz auf das erste Element und dann von jedem Element wieder eine Referenz auf das nächste. Wenn Du am Ende etwas einfügen musst, musst Du zuerst auch das Ende finden. Dazu musst Du beim ersten anfangen (Du hast sonst ja erst gar keine andere Referenz) und dann von Element zu Element gehen, bis Du das letzte in der Liste gefunden hast. Dann erst kannst Du das neue Element hinten anhängen.
Am Anfang der Liste einfügen geht da viel schneller: Du kannst einfach ein neues Element generieren, dessen Referenz auf das bisherige erste Element zeigen lassen und den "Listenzeiger", also die Referenz auf das erste Element auf Dein neu generiertes zeigen lassen, weil das je jetzt das neue erste ist. Du brauchst dafür nicht über die ganze Liste zu laufen.
Verbesserung wäre, wenn Du Dir nicht nur eine Referenz auf das erste sondern auch auf das letzte Element merken würdest. Kannst Du Dir denken, wie das hilft?
Gruß
Marco
|
|
23.04.2015 13:11 |
|
|
 |
Batista unregistriert
 |
|
| Zitat: |
Original von as_string
Verbesserung wäre, wenn Du Dir nicht nur eine Referenz auf das erste sondern auch auf das letzte Element merken würdest. Kannst Du Dir denken, wie das hilft?
Gruß
Marco |
/** Verkettete Liste fuer Daten vom Typ INHALT */
public class Liste<INHALT> implements Iterable<INHALT> {
/** Kopf der Liste */
Knoten<INHALT> kopf;
/** Ende der Liste */
Knoten<INHALT> ende;
** Konstruktor fuer eine leere Liste */
public Liste() {
kopf = null; // Leer
};
Jetzt muss man nicht die ganze Liste durchlaufen, sondern hat gleich die Referenz auf den Letzten Eintrag und so kann man entsprechend schneller am Ende der Liste einfügen.
Zur laufzeit:
Für einfügen am Anfang der Liste, habe ich nur ein Operation demnach 1
O(1) oder??
Beim einfügen am Ende der Liste vor der Verbesserung muss ich n Elemente der Liste durchgehen, bis das Ende erreicht ist und dann entsprechend einfügen
demnach O(n)
Nach der Verbesserung ist gilt O(1) für beide Fälle?
|
|
23.04.2015 18:53 |
|
|
 |
as_string
Haudegen
  
Dabei seit: 06.11.2013
Beiträge: 642
Herkunft: Heidelberg
 |
|
| Zitat: |
Original von Batista
/** Verkettete Liste fuer Daten vom Typ INHALT */
public class Liste<INHALT> implements Iterable<INHALT> {
/** Kopf der Liste */
Knoten<INHALT> kopf;
/** Ende der Liste */
Knoten<INHALT> ende;
** Konstruktor fuer eine leere Liste */
public Liste() {
kopf = null; // Leer
}; |
Die Quelltexte habe ich mir nicht weiter angeschaut. Erstens kann das ein Compiler viel besser und zweitens ist mir das auch zu mühsam so ganz ohne Formatierung und so! Wenn Du Quelltexte angibst achte deshalb bitte darauf, dass Du den "CODE-Einfügen" Knopf oder entsprechende Tags verwendest. Und dann eben auch die Einrückung richtig machst. Das hast Du ja bei Deinen letzten Postings auch schon teilweise gemacht.
| Zitat: |
Original von Batista
Jetzt muss man nicht die ganze Liste durchlaufen, sondern hat gleich die Referenz auf den Letzten Eintrag und so kann man entsprechend schneller am Ende der Liste einfügen.
Zur laufzeit:
Für einfügen am Anfang der Liste, habe ich nur ein Operation demnach 1
O(1) oder??
Beim einfügen am Ende der Liste vor der Verbesserung muss ich n Elemente der Liste durchgehen, bis das Ende erreicht ist und dann entsprechend einfügen
demnach O(n)
Nach der Verbesserung ist gilt O(1) für beide Fälle? |
Ja, das ist alles so weit richtig.
Gruß
Marco
|
|
26.04.2015 12:37 |
|
|
Batista unregistriert
 |
|
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
public Integer min() {
Knoten<Integer> jetzt= super.kopf;
Integer min = jetzt.daten;
while(jetzt != null) {
Integer x= jetzt.daten;
if( min.compareTo(x)>0) {
min = x;
}
}
return min;
}
|
|
Der Complier tut nichts nach
javac IntergerListe.java
java IntergerListe
|
|
23.04.2015 19:53 |
|
|
Batista unregistriert
 |
|
Erster Code stark verbessert
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
public INHALT get(int pos) {
Knoten<INHALT> jetzt = super.kopf;
INHALT x = jetzt.daten;
if(pos == 0){
return x;
} else {
while (pos>0) {
jetzt= jetzt.naechstes;
x=jetzt.daten;
pos--;
}
}
return x;
|
|
|
|
23.04.2015 20:28 |
|
|
 |
as_string
Haudegen
  
Dabei seit: 06.11.2013
Beiträge: 642
Herkunft: Heidelberg
 |
|
| Zitat: |
Original von Batista
Erster Code stark verbessert
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
|
public INHALT get(int pos) {
Knoten<INHALT> jetzt = super.kopf;
INHALT x = jetzt.daten;
if(pos == 0){
return x;
} else {
while (pos>0) {
jetzt= jetzt.naechstes;
x=jetzt.daten;
pos--;
}
}
return x; |
|
|
Bitte Code einrücken, ist ja sonst unlesbar!
Am Ende fehlt eine Klammer.
Du kannst Dir das "if(pos==0)" sparen: Wenn pos wirklich 0 ist, dann geht er ja in die while-Schleife gar nicht rein, weil die als Bedingung ja "pos>0" hat. Nach der while-Schleife machst Du dann ja auch in jedem Fall ein return x;
Also das "if" und das "else" einfach weg lassen und nur die while-Schleife.
In der while-Schleife belegst Du immer wieder x neu, brauchst es dort aber gar nicht. Das kannst Du Dir sparen und brauchst es nur einmal nach der while-Schleife zu machen, bevor Du das x zurück gibst.
Du brauchst auch das x ganz am Anfang nicht bestimmen!
Ganz am Ende fehlt noch eine schließende geschweifte Klammer.
Dann wäre Dein Code schon deutlich kürzer:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
public INHALT get(int pos) {
Knoten<INHALT> jetzt = super.kopf;
while (pos > 0) {
jetzt = jetzt.naechstes;
pos--;
}
return jetzt.daten;
} |
|
Was aber noch fehlt: Falls die Liste zu wenige Elemente enthält, um überhaupt an "pos" springen zu können, dann würde "jetzt.naechstes" in der while-Schleife irgendwann NULL werden und Du würdest eine NULL-Pointer-Exception bekommen wenn das nächste Mal auf "jetzt.naechstes" zugegriffen wird oder auf jetzt.daten ganz am Ende.
Ich würde also auf jeden Fall noch eine Überprüfung auf NULL einbauen und dann lieber eine OutOfBoundsException werfen.
Gruß
Marco
|
|
26.04.2015 12:57 |
|
|
|