Hallo liebe Comunity,
mein erster Post zu einem Problem dass zu lösen habe.
Ich hoffe dass mir jemand helfen kann, da ich weder in einiger Literatur (Güting, Datenstrukt. & Algorithmen, einigen Javabuechern) noch bei Google etwas finden konnte und ich langsam verzweifle..
Gesucht ist eine Implementierung einer Methode
public static int cmm(int[][] matDim), welche die optimale (also kleinstmögliche) Anzahl von Elementmultiplikationen berechnet, die von Nöten sind um mehrere Matrizen zu multiplizieren.
Als Beispiel werden die Matrizen A0(30x1), A1(1x40), A2(40x10) und A3(10x25)., die Elemente sind m*p und p*n bei der Multiplikation.
Mein Ansatz ist folgender:
Es gilt zwar nicht das kommutativgesetz, aber die Matrizen sind immer assoziativ.
Die Matrizen haben, je nach Klammerung, unterschiedlich viele Multiplikationen vor sich..
im Beispiel habe ich durch Trial and Error errechnet, dass A0((A1A2)A3) mit 1400 Multiplikationen offenbar den best case darstellt. Der Worst Case ist(A0A1)(A2A3) mit 41200 Multiplikationen.
Auffällig ist, dass die optimale Lösung immer optimale Teillösungen hat, d.h. ich suche die kürzesten Teilfolgen bzw. Matrixmultiplikationen und weite dann aus. Somit habe ich also einen (?) rekursiven Ansatz, erst alle kurzen (d.hg. 2 Matrixen) optimalen Kombinationen zu finden und dann darauf aufbauend weiterzugehen.
Frage :
Wie implementiere ich das ? Eine einfache Matrix kann ich proggen ud sie beispielsweile mit Zufallszahlen füllen, aber das hilft mir hier nicht weiter. Vielleicht sollte man auch einige Exceptions schmeissen wenn die Spaltenanzahl der ersten und die Zeilenanzahl der folgenden Matrix ungleich sind. Ich bin bei meiner Suche u.a. auf matDim gestoßen, konnte aber in der Collections von java nix dazu finden und auch nicht im "Handbuch der Java-Programmierung" von G. Krüger.
Wie genau kriege ich diese Idee, Stück für Stück nach dem Optimum zu suchen in Java hin? Muss ich quasi alles trail error mässig durchmultiplizieren, die ergebnisse in nem array abspeichern und dann vergleichen?
--> vermutlich ist das totaler quatsch, daraus seht ihr dass ich einfach kein gr. Programmierer bin.
Oder reicht es, wenn ich erstmal nur alle m*n ausprobiere, sie in ein Array speichere und dann nach dem kleinsten Element suche? Ne, das ist quatsch..es reicht vermutlich das kleinste Produkt an n*m, abspeichern, dann nächstes n*m ausrechnen, vergleichen und falls kleiner das alte Ergebnis ersetzen?.Dies dann rekrusiv implementieren ?
hm...
Ich hoffe dass mir jemand ne Idee geben kann (muss kein vollst. code sein, ich will ja selbst auch noch etwas tun =D..andererseits würd ich mich auch nicht wehren xD)
Im ernst, nach meiner anfänglichen Euphorie macht dieses Problem keinen Spass mehr und Eclipse widert mich an. Das darf natürlich nicht sein
Freue mich über jeden Denkanstoß,
danke und Gruß CR
mein erster Post zu einem Problem dass zu lösen habe.
Ich hoffe dass mir jemand helfen kann, da ich weder in einiger Literatur (Güting, Datenstrukt. & Algorithmen, einigen Javabuechern) noch bei Google etwas finden konnte und ich langsam verzweifle..
Gesucht ist eine Implementierung einer Methode
public static int cmm(int[][] matDim), welche die optimale (also kleinstmögliche) Anzahl von Elementmultiplikationen berechnet, die von Nöten sind um mehrere Matrizen zu multiplizieren.
Als Beispiel werden die Matrizen A0(30x1), A1(1x40), A2(40x10) und A3(10x25)., die Elemente sind m*p und p*n bei der Multiplikation.
Mein Ansatz ist folgender:
Es gilt zwar nicht das kommutativgesetz, aber die Matrizen sind immer assoziativ.
Die Matrizen haben, je nach Klammerung, unterschiedlich viele Multiplikationen vor sich..
im Beispiel habe ich durch Trial and Error errechnet, dass A0((A1A2)A3) mit 1400 Multiplikationen offenbar den best case darstellt. Der Worst Case ist(A0A1)(A2A3) mit 41200 Multiplikationen.
Auffällig ist, dass die optimale Lösung immer optimale Teillösungen hat, d.h. ich suche die kürzesten Teilfolgen bzw. Matrixmultiplikationen und weite dann aus. Somit habe ich also einen (?) rekursiven Ansatz, erst alle kurzen (d.hg. 2 Matrixen) optimalen Kombinationen zu finden und dann darauf aufbauend weiterzugehen.
Frage :
Wie implementiere ich das ? Eine einfache Matrix kann ich proggen ud sie beispielsweile mit Zufallszahlen füllen, aber das hilft mir hier nicht weiter. Vielleicht sollte man auch einige Exceptions schmeissen wenn die Spaltenanzahl der ersten und die Zeilenanzahl der folgenden Matrix ungleich sind. Ich bin bei meiner Suche u.a. auf matDim gestoßen, konnte aber in der Collections von java nix dazu finden und auch nicht im "Handbuch der Java-Programmierung" von G. Krüger.
Wie genau kriege ich diese Idee, Stück für Stück nach dem Optimum zu suchen in Java hin? Muss ich quasi alles trail error mässig durchmultiplizieren, die ergebnisse in nem array abspeichern und dann vergleichen?
--> vermutlich ist das totaler quatsch, daraus seht ihr dass ich einfach kein gr. Programmierer bin.
Oder reicht es, wenn ich erstmal nur alle m*n ausprobiere, sie in ein Array speichere und dann nach dem kleinsten Element suche? Ne, das ist quatsch..es reicht vermutlich das kleinste Produkt an n*m, abspeichern, dann nächstes n*m ausrechnen, vergleichen und falls kleiner das alte Ergebnis ersetzen?.Dies dann rekrusiv implementieren ?
hm...
Ich hoffe dass mir jemand ne Idee geben kann (muss kein vollst. code sein, ich will ja selbst auch noch etwas tun =D..andererseits würd ich mich auch nicht wehren xD)
Im ernst, nach meiner anfänglichen Euphorie macht dieses Problem keinen Spass mehr und Eclipse widert mich an. Das darf natürlich nicht sein
Freue mich über jeden Denkanstoß,
danke und Gruß CR