Zeitabschätzung etwas komplexerer Schleife

Ich brauche mal einen Tipp, hab eine Methode die ungefähr so schaut:

private static void komplexe_schleife(int index, int n, ArrayList lis, ArrayList res, Object o) {
	if (n == 0) {
		res.add(o);
		return;
	}
	for (int i = 0; i < lis.size(); i++) {
		for (int j = i + 1; j < lis.size(); j++) {
			if (if_ok(lis.get(i), lis.get(j), res, o)) {
				komplexe_schleife(0, n - 1, lis, res, o);
			}
		}
	}
}

Für n=1 läuft die Methode 180 Sekunden (3 Minuten), wie lange braucht sie dann für bei n=2? (Das Programm läuft jetzt schon 1,5 Stunden)…

Überlege doch mal… könnte es davon abhängen, wieviel Elemente lis enthält? Was willst du eigentlich machen? Feststellen, ob eine Liste schon ein Element enthält und falls nicht, es hinzufügen? Das geht definitiv einfacher.

Zunächst Danke für Deine Antwort.

Eine Art (Rund)Reise berechnen.

Der eigentliche Code ist in C geschrieben, und kann ich posten. Sehen?

Eine Frage wäre auch, ob i immer bei 0 anfangen muss?

Nö, muss es natürlich nicht - meine nächste Frage wäre gewesen, ob du dir denken kannst, wofür der Parameter index wohl da sein könnte.

Mit Rundreise kann ich nicht viel anfangen. Meinst du einen A-Star-Algo?

Bin mir nicht sicher, könnte sein.

Also, wenn zwei Schleifen=180 Sek., dann vier Schleifen=180*180*180*180=17496000 Stunden, stimmt das?

Ganz sicher nicht. komplexe_schleife wird im Extremfall rekursiv für so ziemlich jedes Element aufgerufen, würde ich sagen. 4^180 trifft es eher als 180^4.

Danke. Spacerat, kann ich dir den Code per PN zusenden?

Was versprichst du dir davon?

Weil ich vermute, dass ich einen Fehler in der Logik des Algorithmus hab, und dir der vielleicht schnell auffällt.

Frage: Wie berechnet man alle Wege der Länge l=3 (bzw. 2) zwischen n Punkten, wobei fast jeder Punkt mit jedem über die Luftlinie verbunden ist?

Also:
a -> b -> c
a -> c -> b
c -> b -> a
c -> a -> b
b -> c -> a
b -> a -> c
usw.

Um so etwas schnell zu sehen, habe ich in meiner IDE eingestellt, dass nicht verwendete Parameter einer Methode eine Warnung erzeugen. Das macht nur in ganz speziellen Situationen Sinn (etwa wenn die Methode überschrieben wird und nicht alle Parameter in allen Unterklassen verwendet werden). Meist ist das ein Hinweis auf einen Fehler.

Wie bitte? Wenn l=3 ist, dann steht das Ergebnis doch schon fest. Wenn der Weg aus drei hintereinander liegenden Punkten besteht, dann ist a-c-b ganz sicher länger als a-b-c und das Ziel ist dann auch nicht mehr c, sondern b. Also was soll das werden?

Ich hab dir den Code doch schon per PN zugesendet und er funktioniert auch. Gesucht ist hier nicht der kürzeste Weg, sondern alle Möglichkeiten.

Meinetwegen darf das Thema als gelöst betrachtet werden. Danke für alle Hinweise…