Längste Steigende Sequenz 2D-matrix-Rekursion
Ich habe mit eine neue Hausaufgabe, die hat schon etwas frustrierend, um es gelinde zu sagen. Im Grunde genommen habe ich eine erstellen Sie ein 2D-array von ganzen zahlen wie folgt:
97 47 56 36 60 31 57 54 12 55
35 57 41 13 82 80 71 93 31 62
89 36 98 75 91 46 95 53 37 99
25 45 26 17 15 82 80 73 96 17
75 22 63 96 96 36 64 31 99 86
12 80 42 74 54 14 93 17 14 55
14 15 20 71 34 50 22 60 32 41
90 69 44 52 54 73 20 12 55 52
39 33 25 31 76 45 44 84 90 52
94 35 55 24 41 63 87 93 79 24
ich soll schreiben Sie eine rekursive Methode oder Funktion, wie Sie für die Berechnung der längsten zunehmende sub-Sequenz. In diesem Beispiel, die längste zunehmende sub-Sequenz ist die folgende:
(5,0) with value 12
(6,0) with value 14
(6,1) with value 15
(6,2) with value 20
(7,2) with value 44
(7,3) with value 52
(7,4) with value 54
(6,3) with value 71
(5,3) with value 74
(4,3) with value 96
So, ich bin nicht nur zu prüfen, N,S,E,W für Werte größer, aber ich habe auch das Konto für die diagonalen. Ich getan haben umfangreiche Forschung auf, wie zu lösen dieses rekursiv, allerdings hatte ich nicht viel Glück, und die Rekursion ist mein schwächstes Thema (ja, ich weiß, wie mächtig es sein kann in bestimmten Situationen). Ich habe gesehen, etwas ähnliches gepostet, wo jemand erwähnte, ein Acryl-graph, aber das ist nicht das, was ich Suche.
Bisher habe ich im Grunde gepolsterte mein 2D-array mit 0 ist so, dass ich nicht haben, um sorgen über die umgebenden, und ich bin mit geschachtelten for-Schleifen zum Durchlaufen des 2D-Arrays. Innerhalb dieser Schleifen bin ich grundsätzlich der überprüfung, ob N,NE,E,SE,S,SW,W,NW, haben einen größeren Wert als das aktuelle element. Sorry, wenn ich verärgert einige von Ihnen, dies ist mein Erster Versuch einen Beitrag. Wenn Sie mich brauchen, um post code, das werde ich tun. Ich danke Ihnen sehr für Ihre Zeit!
InformationsquelleAutor der Frage Mike73 | 2011-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update
Lernte ich die dynamische Programmierung vor kurzem, und ich gefunden haben, einen besseren Algorithmus für die Frage.
Der Algorithmus ist einfach: finden Sie die längste Länge für jeden Punkt, und zeichnen Sie das Ergebnis in ein 2D-array, so dass wir nicht brauchen, zu berechnen, der längsten Länge, die für einige Punkte wieder.
Rekursion
1) beginnen Sie mit einem Punkt (und dieser Schritt muss für alle erforderlichen Punkte)
2) wenn Nein umliegenden Punkt größer ist, dann ist dieser Weg endet; sonst wählen Sie eine größere umliegende Punkt, um weiter den Weg, und gehe zu 2).
2.1), wenn die (Ende) - Pfad ist länger als aufgenommen längsten Pfad, ersetzen, selbst als die längste.
Hinweis
(weniger Berechnung, aber mehr Code)
Für den längsten Pfad, der start-Punkt ein lokales minimum, und der Endpunkt wird ein lokales maximum zeigen.
Lokales minimum, kleiner als (oder gleich) alle (am meisten) 8 umliegende Punkte.
Lokales maximum, größer als (oder gleich) alle (am meisten) 8 umliegende Punkte.
Nachweis
Wenn der Pfad nicht mit einem lokalen minimum, dann der start-Punkt muss größer sein als mindestens einer umlaufenden Punkt, und damit ist der Weg verlängert werden kann. Ablehnen! Also, der Pfad muss beginnen mit einem lokalen minimum. Ähnlich aus dem Grund, um am Ende mit einem lokalen maximum.
pseudo-code
InformationsquelleAutor der Antwort Dante is not a Geek
Anderen Ansatz: Art der matrix-Einträge, indem Sie den Wert in Ihnen. Die Iteration von der größten bis zur kleinsten. Für jeden Eintrag berechnen Sie den längsten Pfad in konstanter Zeit: längster Pfad ist 1 + maximale über die längsten Wege für die größeren Nachbarn (bereits berechnet).
Gesamtzeit: O(mn log(mn)) zum Sortieren der matrix-Einträge, plus O(mn) zu finden, die längsten Pfade.
InformationsquelleAutor der Antwort Irit Katriel
java-Komplettlösung
Es gibt Pfade in die Konsole und kehrt längste Sequenz, aber Sie können etwas ändern diesen code, und Sie bekommen die längste Pfad auch
InformationsquelleAutor der Antwort Eugene Kisly
Ich weiß, das ist eine sehr alte Frage, aber ich lese Lubomir Stanchev Buch mit dem Titel Java zu Lernen Durch Spiele, und das Kapitel 14 Projekt ist, dass die genaue 2D-array von ganzen zahlen. Die Belegung ist zu finden, die längste steigende Sequenz, sondern nur in zwei Richtungen, nach Süden und Osten, keine diagonalen oder nichts. Noch es dauerte Stunden, um herauszufinden, die Logik, die nicht verwendet werden, um die Rekursion.
Ich vereinfachte das problem durch die Schaffung von Hilfs-Methoden, die überprüfen, ob der nächste index auch gültig ist, die in diese Richtung (das heißt, nicht out of bounds und größer als der aktuelle Wert). Dann setzte ich die base-case-am Anfang der Methode, was ist, wenn es keine nächste mögliche index. Der schwierige Teil ist die Zuordnung der String-variable, also jedes mal, wenn die Methode nutzt eine Rekursion, die Indizes sind gespeichert in dem String. Ich löste es, indem Sie mithilfe der Zeichenfolge.Länge () - Methode vergleichen Sie die Länge der einzelnen Sequenz, wenn es mehr als einen möglichen Pfad.
Mit der basic-Logik an Ort und Stelle, um eine Erweiterung der Methode alle, die es erfordern würde, ist die Schaffung von mehr Hilfs-Methoden, die in der Richtung Bedarf, und hinzufügen dieser Richtungen der Logik.
}
InformationsquelleAutor der Antwort Ricardo Ferreira Peñalver