Zweidimensionales Array wie rekursiv aufrufen?

2 Antworten

Es gibt in Java keine Slices, wenn du sowas meinst. Du könntest das bestehende Array verkleinern (bäh, sagt der Freund der funktionalen Programmierung) oder eine neue Kopie anlegen (auch eher bäh, wenn auch nicht so schlimm).

Aber, noch einfacher: du kannst doch einfach den gewünschten Anfangsindex als Parameter mitgeben.


computerfan001 
Beitragsersteller
 15.10.2020, 17:40

Danke für die Antwort. inwiefern meinst du den Anfangsindex angeben? Quasi ein komplett neues Array erstellen mit einer doppelten For-Schleife? Problem ist nämlich , ich bin auf maximal O(n^2) Gesamtlaufzeit begrenzt

alfredo153  15.10.2020, 17:42
@computerfan001

Statt ein kleineres Array mitzugeben, gibst du einen zusätzlichen Parameter mit dem Anfangsindex mit, und dasselbe Array. Also: "fange nicht bei Index 0 an, sondern bei Index i". Dein O(n^2) ist damit nicht in Gefahr.

computerfan001 
Beitragsersteller
 15.10.2020, 17:44
@alfredo153

Achso, das habe ich doch mit bfs(graph[i][],start); getan oder nicht? Ich hatte nämlich die gleiche Idee, nur hat das mit Obrigem leider nicht geklappt. Falls du einen Tipp hat, wie man das verändern kann, damit das passt, wär ich dir dankbar

alfredo153  15.10.2020, 17:44
@computerfan001

Ja, so klappt das eben nicht - du musst der Methode einen neuen Parameter mitgeben. Nenne ihn halt startRow oder sowas, beim ersten Aufruf 0.

computerfan001 
Beitragsersteller
 15.10.2020, 17:47
@alfredo153

Die Parameter des Methodenkopfes darf ich leider nicht ändern, weil meine Lösung nach vordefinierten Testfällen überprüft wird (die nicht änderbar sind). Hast du sonst einen weiteren Vorschlag wie man das lösen kann?

computerfan001 
Beitragsersteller
 15.10.2020, 17:49
@alfredo153

Der Methodenkopf, also public List<Integer> bfs(int[][] graph, int start) {} ist vorgegeben und ich darf nur eine List und/oder einen Stack zusätzlich zu den Methoden von Java.lang.Object verwenden, mehr nicht. Ich soll dann daraus eine Implementation für die Breath First Search ableiten

alfredo153  15.10.2020, 18:03
@computerfan001

Diese ganzen Einschränkungen vorher zu wissen, würde die Diskussion wohl erleichtern...gibt es einen Zwang zu einer rekursiven Lösung? BFS kannst du genauso iterativ machen, wenn du eine List verwenden darfst.

computerfan001 
Beitragsersteller
 15.10.2020, 18:04
@alfredo153

Iterativ würde auch gehen, nur hab ich da keine Idee im Kopf, wie ich das lösen soll mit einem zweidimensionalen Array. Daher hab ich an rekursiv gedacht. Die oben genannten sind die einzigen Einschränkungen :)

alfredo153  15.10.2020, 17:39

Das war jetzt missverständlich formuliert: du musst in jedem Fall ein neues Array anlegen, ob du das "Verkleinern" oder "Kopie anlegen" nennst ist nur eine Frage der Betrachtung. Tatsächlich in-place verkürzen kannst du ein Array nicht.

Es gibt ja den Array.remove(0) Befehl, der das erste Element in einem Array löscht. Im Notfall also einfach einmal über jede Spalte iterieren und den Befehl für jede Zeile aufrufen.

Aber es gibt sicherlich Laufzeiteffizientere Möglichkeiten, hoffe ich...

Woher ich das weiß:Studium / Ausbildung – Physik Studium - Master in theoretischer Physik

computerfan001 
Beitragsersteller
 15.10.2020, 17:40

Danke für die Antwort, kannst du mir sagen wie man das für ein zweidimensionales Array anwendet? Bei einem eindimensionalen Array kenne ich nämlich nur die Anwendung dieses remove Befehls

DrNumerus  15.10.2020, 18:07
@computerfan001

Also ich dachte an sowas wie:

for(int i= 0; i<graph.length; i++){
      graph[i].remove(0);
}

oder so. Also iterativ kleiner machen. Damit löscht du dann immer die "oberste" Zeile.

computerfan001 
Beitragsersteller
 15.10.2020, 20:30
@DrNumerus

Danke für den Tipp, leider hat es nicht geklappt. Der Quellcode zickt etwas. Hast du sonst einen weiteren Vorschlag?