5.3

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

5.3
Hallo ,

ich habe eine Frage über Arrays

System.out.println(Arrays.deepToString(divide(new int[][] {{ 1, 11, 5 }, { 2, 6, 7 }, { 3, 13, 19 } }, 1, true)));

in welche Stelle ist diese was in rot gemerkt ist ? Annahme dass ist Array [][] , was soll in diese kleine Kästchen kommen um an diese Stelle zu zeigen ({ 1, 11, 5 })

Bitte das langsam erklären , ich kann das nicht richtig beherrschen

Danke im Voraus


Das rot markierte Array ist an Position 0, also array[0], aber schau dir folgendes Beispiel an:

int[][] array = { {1,2,3} , {4,5,6} , {7,8,9} , {0} , {-1,-2} };

int[] array0 = array[0]; //hier sind die Werte 1,2,3 gespeichert
int[] array1 = array[1]; //hier sind die Werte 4,5,6 gespeichert
int[] array2 = array[2]; //hier sind die Werte 7,8,9 gespeichert
int[] array3 = array[3]; //hier ist nur der Wert 0 gespeichert, als Array
int[] array4 = array[4]; //hier sind die Werte -1, -2 gespeichert

int zahl00 = array[0][0]; //hier ist der Wert 1 gespeichert
int zahl01 = array[0][1]; //hier ist der Wert 2 gespeichert
int zahl02 = array[0][2]; //hier ist der Wert 3 gespeichert
int zahl41 = array[4][1]; //hier ist der Wert -2 gespeichert

Ich hoffe, dass das verständlich genug ist.


Danke …ich hoffe ich kann jetzt weiter :smiley:


ich kann nicht verstehen , diese Aufgabe musste einfach sein , aber so kompliziert zu verstehen .

ich habe b) versucht zu lösen , aber habe ich noch geschafft am Ende bekomme so was

[1, 11, 3, 13, 10, 0]Exception in thread “main”
[]
[[1, 11, 5], [2, 6, 7], [3, 13, 19]]
189
java.lang.ArrayIndexOutOfBoundsException: 0
at SkylineSolver.divide(SkylineSolver.java:76)
at SkylineSolver.main(SkylineSolver.java:113)

kann jemand mir erklären wo mein Fehler legen kann , ich habe schon eine Methode gemacht , die die erste Gebäude in einem neue Array zurückgibt ,
aber ich bekomm eine ganz leere Array … und wenn isLeft false ist , habe ich eine Methode von ClosestPair benutzt .

diese Arrays.copyOfRange , vielleicht habe ich nicht richtig verstanden was diese Methode macht . ich bin durch einander , ich brauche Hilfe damit !!

conquer
Hallo,
ich habe eine Frage zu conquer. Ich bekomme das nicht hin, ich verstehe auch wieso mein Code nicht funktioniert. Aber ich weiß nicht wie ich es richtig machen muss. Kann mir jemand nen kleinen Tipp geben?
Ich versuche derzeit zunächst divide aufzurufen, um das gegebene Array zu halbieren, dann conquer erneut aufrufen, mit den beiden Hälften, um es dann anschließend zu mergen. Aber das gibt mir dann immer den ersten und den zweiten Punkt des Arrays aus. Wie kann man das denn an das was man schon hat anhängen? Scheinbar geht es ja da schief.

Sitze jetzt schon ewig dran und seh den Wald vor lauter Bäumen nicht mehr…


Hallo, ich hatte dasselbe Problem.
Aber durch den Erklärungsbeitrag in dem Thread https://fsi.informatik.uni-erlangen.de/forum/thread/12052-5-3-Skyline;?sessionid=f53020d3f7938fa0493bb2793912c3c2
hab ichs sofort verstanden. Schau dir auch die Vorlesungsfolie dazu an für n/2 Gebäude und denk an ‘divide and conquer’ ;). Ich kann leider nicht anders helfen, denn alles andere würde sofort die Lösung offenbaren …

gelöst
Ok, mein Problem hat sich schon gelöst.
Ich hatte die Basisfälle falsch… wie üblich war das alles was gefehlt hat:)


Du greifst auf das erste Element eines leeren Arrays zu. „ArrayIndexOutOfBoundsException“ heißt immer, dass du auf ein Element eines Arrays zugreifen wolltest, welches nicht existiert. (z.B. auf das 8te Element eines Arrays mit nur 7 Elementen.) Die Zahl „0“ hinter „java.lang.ArrayIndexOutOfBoundsException“ gibt dir an, welchen Index du lesen wolltest. In diesem Fall wolltest du auf das 1te Element (Index 0) zugreifen, aber das Array hatte keine Elemente.

Die Methode divide sollte ohne Methoden aus der ClosestPair gelöst werden können. Mir fällt auch keine Methode aus ClosestPair auf, die dir besonders hilfreich bei der Implementierung der Methode divide wäre.

Hier findest du die offizielle Dokumentation der Methode Arrays.copyOfRange(int original, int from, int to): Arrays (Java Platform SE 7 ). Die Methode kopiert ein Teil des Eingabearrays (original) und gibt dir den kopierten Teil zurück. Der Parameter „from“ ist der Index des ersten Elementes, das in dem zurückgegebenen Array auftaucht. Der Parameter „to“ ist der Index des ersten Elementes, welches nicht mehr in dem zurückgegebenen Array auftaucht.

Ein Beispiel, wie die Methode benutzt wird:

import java.util.Arrays; // Wichtig! Ohne diese Zeile kannst du die Methode nicht verwenden.

public class Test {
  public static void main(String[] args) {
    int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    int[] a1 = Arrays.copyOfRange(array, 0, 4);  // {0, 1, 2, 3}
    int[] a2 = Arrays.copyOfRange(array, 4, 10); // {4, 5, 6, 7, 8, 9}
  }
}

Danke alle :D:D

was macht merge genau
kann das sein das merge nicht das macht was es sollte?
weil wenn ich eine 2 Gebäde merge kommt nicht das raus was ich erwarten würde:
Gebäude1 : {{1,5,6}} => Skyline1:{5,5,5,5,5,5}
Gebäude2 : {{3,8,5}} => Skyline2:{0,0,8,8,8,0}
sollte dann nicht {5,5,8,8,8,5} rauskommen
merge macht daraus [0, 0, 5, 5, 8, 8, 8, 0]

aus dem schon vorhandenen test mit den beiden skylines: { 1, 11, 3, 13, 9, 0 } und { 2, 6, 7, 13, 10, 0 }
macht merge [1, 11, 3, 13, 10, 0]

und ich hätte noch eine Frage : soll ein Gebäude bei dem die linke ecke auf pos 1 ist bei der skyline bei 0 anfangen oder auch bei 1? also geb={{1,3,2}} soll die skyline {3,3} oder {0,3,3} sein


Hallo zusammen,

Ich habe die folgende Rückgabe in Skylinesolver, die falsch ist

[1, 11, 3, 13, 10, 0]
[[1, 11, 5]]
[[2, 6, 7], [3, 13, 19]]
189
[[1, 11, 5], [2, 6, 7]]
[[14, 3, 25], [19, 18, 22], [23, 13, 29], [24, 4, 28]]
[1, 0]
0

(conquer ist falsch. Ich teile mein Array, dann bearbeite ich die Ergebnisse mit conquer, dann verbinde die Teilen). Ich habe schon alle Threads gelesen, aber noch keine Ahnung habe, wie ich das Problem lösen kann. Könnte jemand noch helfen?


Schau dir in den Vorlesungsfolien mal an, wie Skylines repräsentiert werden.
Das geschieht in der Form: {x-Koordinate an der sich die Höhe ändert, neue Höhe, x-Koordinate an der sich die Höhe ändert, neue Höhe, …}

Also bei deinem Beispiel:
Gebäude1 : {{1,5,6}} => Skyline1:{1,5,6,0}
Gebäude2 : {{3,8,5}} => Skyline2:{3,8,5,0}


Danke Volschaf !
jetz geht alles