Zweidimensionales Array wie rekursiv aufrufen?
Hallo,
ich habe ein zweidimensionales Array, bei der ich die BFS durchführen möchte,. Dabei möchte ich den anfangs übergebenen Graph, der als zweidimensionales Integerarray dargestellt ist( Java) im nächsten rekursiven Schritt so weitergeben als Parameter, dass quasi nur das zweidimensionale Array ohne den jeweils obersten Index bleibt, diesbezüglich möchte ich fragen, wie man das deklariert in Java.
danke im Voraus.
Anbei mein Quelltext:
public List<Integer> bfs(int[][] graph, int start) {
List<Integer> result = new ArrayList<Integer>();
if(!result.contains(start))
{
result.add(start);
}
int j=0;
for(int i= 0; i<graph[j].length; i++)
{
if(!result.contains(graph[j][i]))
{
result.add(graph[j][i]);
}
]
bfs(graph[i][],start); // Hier soll der Graph erneut aufgerufen werden, nur ohne Index 0 , also 1 Zeile weniger
return result;
}
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.
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.
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
Ja, so klappt das eben nicht - du musst der Methode einen neuen Parameter mitgeben. Nenne ihn halt startRow oder sowas, beim ersten Aufruf 0.
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?
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
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.
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 :)
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...
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
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.
Danke für den Tipp, leider hat es nicht geklappt. Der Quellcode zickt etwas. Hast du sonst einen weiteren Vorschlag?
Warum hat es denn nicht funktioniert? Also was der Error, wenn vorhanden?
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