unschöne schleifen.jemand ne bessere idee

Status
Nicht offen für weitere Antworten.
S

souly

Gast
hallo,

habe folgendes problemchen oder besser anliegen.

hab mir einen algorithmus implementiert bei dem ich ein Eingabearray bekomme (unsortiert) und dann die n-größte zahl ermittelt, dabei wird das eingabearray in 3 weitere arrays aufgeteilt. eins in dem alle werte kleiner einem vergleichswert sind, eins für die, die exakt dem vergleichswert entsprechen und dann noch eins wo alles größer als der vergleichswert reinkommt.

klappt soweit wunderbar, nur was mich etwas stört, ich muss zuerst das gesamte array durchlaufen und die vergleichsopration auf <, > bzw. = durchführen und zählen wieviele werte für die 3 neuen arrays, in die das ganze aufgeteilt werden, soll jeweils hinein müssen.
dann erzeuge ich die 3 arrays anhand der ermittelten größen und lassen exakt die selbe vergleichsroutine nochma durchlaufen, nur das ich diesesmal die werte halt verschiebe, bzw kopiere.

Das ist natürlich doppelt-gemoppelt. Kann man das irgendwie kombinieren oder sich den zweiten durchlauf sparen? find das so sehr unschön

Code:
//Zählen wieviele Elemente in die 3 Mengen gehören
		int sizeL=0, sizeE=0, sizeG=0;
		
		for (int i=0; i < in.length; i++)
		{
			if (cmp.compare(in[i], in[rndDigit]) < 0)
				sizeL++;
			else if (cmp.compare(in[i], in[rndDigit]) == 0)
			 	sizeE++;
			else
				sizeG++;
		}
		
		//Hilfsarrays erstellen
		Object 	[] l = new Object [sizeL]; int lc = 0;
		Object	[] e = new Object [sizeE]; int ec = 0;
		Object	[] g = new Object [sizeG]; int gc = 0;
		
		//Eingangsarray in die Hilfsarrays verteilen gemäß Vergeichsschlüssel
		for (int i=0; i < in.length; i++)
		{
			if (cmp.compare(in[i], in[rndDigit]) < 0)
				l[lc++] = in[i];
			else if (cmp.compare(in[i], in[rndDigit]) == 0)
			 	e[ec++] = in[i];
			else
				g[gc++] = in[i];
		}
 

Marco13

Top Contributor
Hm - man könnte statt Arrays einfach Listen nehmen (z.B. ArrayList) und die dann bei Bedarf am ende mit list.toArray in Arrays zurückverwandeln. Alternativ könnte man (je nachdem, worum es da geht) die Arrays am Anfang alle so groß machen, wie das hauptarray, und am ende die Daten umkopieren (und Arrays der passenden Größe). Muss man sich überlegen - letzteres sieht erstmal komisch aus, könnte aber "effizienter" sein als die Lösung mit der List.
 
S

souly

Gast
das ganze ist eine implementierung des randomized quick select algorithmus.

http://pine.cs.yale.edu/pinewiki/QuickSelect

hab mich jetzt mal so beholfen....sieht vom stil her schöner aus, aber ob es wirklich perfomanter ist.

ich kopiere jetzt nur noch 3x die arrays, anstatt die vergleichsoperation auszuführen....


Code:
		//Hilfsarrays erstellen
		Object 	[] l = new Object [in.length]; int lc = 0;
		Object	[] e = new Object [in.length]; int ec = 0;
		Object	[] g = new Object [in.length]; int gc = 0;
		
		//Eingangsarray in die Hilfsarrays verteilen gemäß Vergeichsschlüssel
		for (int i=0; i < in.length; i++)
		{
			if (cmp.compare(in[i], in[rndDigit]) < 0)
				l[lc++] = in[i];
			else if (cmp.compare(in[i], in[rndDigit]) == 0)
			 	e[ec++] = in[i];
			else
				g[gc++] = in[i];
		}
		
		//Umkopieren in Arrays mit passenden Längen
		Object [] x;
		x = new Object [lc];
		for (int i=0; i < lc; i++)
			x[i] = l[i];
		l = x;
		
		x = new Object[ec];
		for (int i=0; i < ec; i++)
			x[i] = e[i];
		e = x;
		
		x = new Object[gc];
		for (int i=0; i < gc; i++)
			x[i] = g[i];
		g = x;
 

Marco13

Top Contributor
Ach so ja - bei "umkopieren" dachte ich eigentlich an drei Aufrufe von System.arraycopy - das macht zwar im Prinzip das gleiche, sieht aber deutlich hübscher aus :)

Wäre halt interessant zu wissen, um welche Arraygrößen es da geht. Wenn das ein Array mit 10 Millionen Einträgen ist, und man weiß z.B. das nur wenige (<10) Zahlen GLEICH der Zahl n sind, dann bräuchte man dafür keinen weiteren Array mit 10 Millionen Einträgen zu erstellen....

Wenn ich den Pseudocode aus dem Wiki richtig überflogen habe, wird das ganze ja Rekursiv aufgerufen - das sollte dann ggf. nicht alles mit neuen Arrays gemacht werden: Man könnte VIELLEICHT (das müßte man sich überlegen!) EINmal die großen Arrays erstellen, und die dann ALLE DREI der Methode übergeben. Bei den Rekursiven aufrufen würden die dann die Rollen tauschen... grob

Code:
void doit(int a[], int k)
{
    int temp0[] = new int[a.length];
    int temp1[] = new int[a.length];
    doit(a, temp0, temp1, k);
}

void doit(int a[], int temp0[], int temp[1], int k)
{
    verteileAuf(temp0);
    verteileAuf(temp1);
    ...
    if (bla)
    {
       // Rekursiver aufruf:
       doit(temp0, a, temp1, k) // Arrays a und temp0 tauschen die Rollen
    }
    else
    {
       // Rekursiver aufruf:
       doit(temp1, temp0, a, k) // Arrays a und temp1 tauschen die Rollen
    }

}
ist aber nur ein spontaner Gedanke - müßte man sich mal genauer überlegen.
 
G

Gast

Gast
denke ich werds so lassen, ich weis nämlich nicht genau ob es seitens des Aufgabenstellers ok ist vorgefertigte Routinen zum kopieren zu nehmen....auch wenn das was ich mache vermutich der selbe code ist, der dabei ausgeführt werden würde.

danke fürs mitdenken. dachte es gäb da einen direkten, besseren ansatz. dann lass ich es so....es läuft ja :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L "unschöne" if-Abfragen Java Basics - Anfänger-Themen 4
A Unschöne Html Fehlermeldung bei Eclipse Java Basics - Anfänger-Themen 8
T schleifen Java Basics - Anfänger-Themen 3
Kingdako Wie löse ich eine Mathematische Formel mit Arrays und Schleifen? Java Basics - Anfänger-Themen 32
S Erste Schritte While Schleifen Java Basics - Anfänger-Themen 11
M geschachtelte for-Schleifen - Einmaleins ausgeben Java Basics - Anfänger-Themen 3
Mikejr Schleifen Java Basics - Anfänger-Themen 4
java-starter Erste Schritte Mit While Schleifen Programme schreiben Java Basics - Anfänger-Themen 4
K geschachtelte "for-Schleifen" Java Basics - Anfänger-Themen 3
Alen123 Potenzen in Schleifen Java Basics - Anfänger-Themen 26
Alen123 String wiederholen mit Schleifen Java Basics - Anfänger-Themen 1
A Schleifen und Boolsche Ausdrücke Java Basics - Anfänger-Themen 42
W Schleifen Java Basics - Anfänger-Themen 36
S Interaktive Abfrage, Hilfe mit Schleifen! Java Basics - Anfänger-Themen 6
Mojtaba1986 Hausaufgabe (Schleifen) Java Basics - Anfänger-Themen 33
A Schleifen Verzweigungen Java Basics - Anfänger-Themen 18
C Sind die while-Schleifen richtig in for-Schleifen ersetzt worden? Java Basics - Anfänger-Themen 8
D Schleifen Problem Java Basics - Anfänger-Themen 2
H Muster mit verschachtelten Schleifen kreieren. Java Basics - Anfänger-Themen 2
A Schleifen in Java Java Basics - Anfänger-Themen 4
A Schleifen, Hilfe! Java Basics - Anfänger-Themen 6
C Schleifen Durchlauf Java Basics - Anfänger-Themen 7
M While-Schleifen-Fehler Java Basics - Anfänger-Themen 4
J Schleifen Wiederholendes Zeichenmuster Java Basics - Anfänger-Themen 4
K For-Schleifen Ablauf Java Basics - Anfänger-Themen 5
L Anzahl der Aufrufe von Schleifen bestimmen Java Basics - Anfänger-Themen 1
S Hilfe bei Java Aufgabe (Schleifen) Java Basics - Anfänger-Themen 25
B Verschachtelte For Schleifen Java Basics - Anfänger-Themen 8
G Input/Output Schleifen Durchlauf Java Basics - Anfänger-Themen 5
A Erste Schritte Schleifen Java Basics - Anfänger-Themen 5
J Muster und Schleifen Java Basics - Anfänger-Themen 33
H ERGÄNZUNGSFRAGE: Klammersetzung bei if-else Anweisungen und Schleifen Java Basics - Anfänger-Themen 2
scratchy1 Argumente mit verschiedenen Schleifen ausgeben Java Basics - Anfänger-Themen 3
C Schleifen Java Basics - Anfänger-Themen 12
E geschachtelte for-schleifen Java Basics - Anfänger-Themen 6
L Übungsaufgabe zu Schleifen Java Basics - Anfänger-Themen 7
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
A Erste Schritte for-Schleifen vereinfachen Java Basics - Anfänger-Themen 5
S Immer das selbe mit den Schleifen Java Basics - Anfänger-Themen 24
kokojamboo92 Schleifen und Arrays Java Basics - Anfänger-Themen 7
N Problem mit Schleifen Java Basics - Anfänger-Themen 20
O Array, geschachtelte For-Schleifen Java Basics - Anfänger-Themen 34
S While-Schleifen Ausgabe als String? Java Basics - Anfänger-Themen 1
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
D verschachtelte Schleifen Java Basics - Anfänger-Themen 6
H Schleifen (anfänger) Java Basics - Anfänger-Themen 13
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
L Schachbrettnummerierung mit Schleifen.. Java Basics - Anfänger-Themen 3
H Schleifen Java Basics - Anfänger-Themen 8
L Zahlentripel und for-Schleifen Java Basics - Anfänger-Themen 2
T Spezielle Aufgabe zu Schleifen Java Basics - Anfänger-Themen 3
T Erste Schritte Schleifen-Stop Java Basics - Anfänger-Themen 14
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
I Mehre While-Schleifen hintereinander Java Basics - Anfänger-Themen 13
P Terminieren diese Schleifen Java Basics - Anfänger-Themen 6
L Was heißt terminieren bei Schleifen? Java Basics - Anfänger-Themen 3
I Brauche Hilfe bei Schleifen Java Basics - Anfänger-Themen 18
C Erste Schritte While-Schleifen-Problem Java Basics - Anfänger-Themen 3
W Schleifen bei Greenfoot Java Basics - Anfänger-Themen 4
B Operatoren Stopp von Schleifen Java Basics - Anfänger-Themen 9
K Loop ohne Schleifen Java Basics - Anfänger-Themen 2
V Rechenzeichen bei Termen - Darstellung bei Schleifen Java Basics - Anfänger-Themen 7
E Muster auf der Konsole ausgeben lassen (Schleifen) Java Basics - Anfänger-Themen 7
C Erste Schritte Probleme bei Aufgaben zu Schleifen Java Basics - Anfänger-Themen 11
F OOP Schleifen und Probleme mit Setter und Getter Java Basics - Anfänger-Themen 1
L Blöcke bei verschachtelten Schleifen Java Basics - Anfänger-Themen 3
L Kurze Frage zu verschachtelten Schleifen Java Basics - Anfänger-Themen 3
E Erste Schritte Sternchenpyramide mit For-Schleifen erstellen Java Basics - Anfänger-Themen 9
H Best Practice Wie mit break verschachtelte Schleifen komplett verlassen? Java Basics - Anfänger-Themen 2
arti28 Erste Schritte For-Schleifen und While-Schleifen, String als Muster ausgeben. Java Basics - Anfänger-Themen 3
T [Schleifen] Schleifenproblem Java Basics - Anfänger-Themen 4
F Verschachtelte Schleifen Java Basics - Anfänger-Themen 4
J Hilfe verschachtelte Schleifen Java Basics - Anfänger-Themen 5
O Geschachtelte For-Schleifen Java Basics - Anfänger-Themen 1
D Zeichnen, Schleifen Java Basics - Anfänger-Themen 7
S Zeichnen , Schleifen Java Basics - Anfänger-Themen 4
L Schleifen und Array, nur letzte Eingabe wird ausgegeben Java Basics - Anfänger-Themen 3
Z Frage zu for-Schleifen Java Basics - Anfänger-Themen 5
M Wie kann ich eine Ausgabe vervielfachen? (Schleifen) Java Basics - Anfänger-Themen 4
Z Schleifen Beispiel: Fakultät Java Basics - Anfänger-Themen 26
T Erneute Frage zu Schleifen Java Basics - Anfänger-Themen 4
V Schleifen die nicht voneinander abhängen! (für CAN-BUS) Java Basics - Anfänger-Themen 10
T Anfängerfrage zu Schleifen und Arrays Java Basics - Anfänger-Themen 5
S for-Schleifen Problem Java Basics - Anfänger-Themen 4
W Methoden While Schleifen Ergebnis im String speichern Java Basics - Anfänger-Themen 5
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
J Anzahl von for-Schleifen in Abhängigkeit von Zahleneingabe erzeugen Java Basics - Anfänger-Themen 1
X Methoden Logik-Problem mit Schleifen. Java Basics - Anfänger-Themen 7
J MouseListener für Schleifen-Objekte Java Basics - Anfänger-Themen 13
W Aufgabe mit Schleifen Java Basics - Anfänger-Themen 8
M Sektkelch mit Schleifen Java Basics - Anfänger-Themen 9
F Methoden JTable + 2 For-Schleifen Java Basics - Anfänger-Themen 4
I Listen, for - Schleifen Java Basics - Anfänger-Themen 8
N Schleifen Problem Java Basics - Anfänger-Themen 3
L Histogram mittels Schleifen und Arrays Java Basics - Anfänger-Themen 9
A Ausgabe von Schleifen nebeneinander? Java Basics - Anfänger-Themen 3
T durchlaufene while-Schleifen zählen Java Basics - Anfänger-Themen 3
L schleifen fehler Java Basics - Anfänger-Themen 12
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
K Schleifen und Exceptions Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben