Fragen zu dynamischen Programmieralgorithmen sind häufig häufige Fragen in schriftlichen Prüfungen großer Unternehmen. In vielen öffentlichen WeChat-Konten werden Artikel zum Thema „dynamische Programmierung“ verwendet. Sie alle versuchen, die dynamische Programmierung mit den einfachsten und verständlichsten Worten zu beschreiben und zu erklären Tatsächlich können alle durch die Nummer geschobenen Artikel gelesen und verstanden werden, und jeder kann ein allgemeines Verständnis der dynamischen Programmierung erlangen.
Was ist dynamische Programmierung? Laienhaft ausgedrückt kann man die Lösung eines Problems auf einen Blick erkennen (erschöpfende Liste), aber man kann sie nicht einzeln aufzählen. Mit anderen Worten: Es wird Fragen wie „die“ geben „am meisten“ und „am meisten“ in der Frage „Mindestens“, „wie viele Arten gibt es insgesamt“ und anderen Formulierungen können diese Fragen theoretisch mit der Idee der dynamischen Programmierung gelöst werden. Dynamische Programmierung ähnelt der Divide-and-Conquer-Methode. Sie löst das ursprüngliche Problem durch die Kombination der Lösungen von Teilproblemen, löst jedoch jedes Teilproblem nur einmal und speichert es in einer Tabelle ohne Neuberechnung Wird normalerweise zur Lösung optimaler Probleme verwendet —— „Einführung in Algorithmen“ .
Distanz bearbeiten (Bearbeiten Distanz), bezieht sich in diesem Artikel auf die Distanz Levenshtein , bei der es sich um die Zeichenfolge S1Die Mindesthäufigkeit , die durch die drei Vorgänge Einfügen , Ändern und Löschen in eine Zeichenfolge S2 umgewandelt werden kann. Zum Beispiel: S1 = abc, S2 = abf, Abstand bearbeiten d = 1 ( Es muss nur c in f geändert werden. In diesem Artikel wird die Algorithmusidee der dynamischen Programmierung verwendet, um den Bearbeitungsabstand von Zeichenfolgen zu lösen.
Definition: S1, S2stellt zwei Zeichenfolgen dar , S1(i) stellt S dar. Die erste Zeichen von 1, d[i, j] bedeutet S1s tes i Präfix zum jten Präfix von S2 (z. B. :S1 = "abc" ,S2 = "def",Lösen Sie den Bearbeitungsabstand von S1 bis S2 als d[3 , 3]).
S1 = „abc“, S2 = „dec“, dann ist ihr Bearbeitungsabstand d[3, 3] = 2, beachten Sie dass das letzte Zeichen der beiden Zeichenfolgen dasselbe ist, d. h. S1(3) = S2(3) erfordert keine Transformation, also S1 = “abc“, S2 = „dec“ <= > S1' = "ab", S2' = "de", das heißt, wenn S1[i] = S[j], , d [i, j] = d[i-1,j -1]. Holen Sie sich die Formel: d[i, j] = d[i - 1, j - 1] (S1[i] = S2[j])
Die obige Formel ergibt die Berechnungsformel , wenn S1[i] = S2[j] Offensichtlich gibt es eine andere Situation, in der S1[. i] ≠ S2[j], wenn S1 = „abc“, S2 = „def“. Der Prozess der Konvertierung von S1 in S2 kann "geändert", Sie können aber auch " bis "" einfügen, "löschen “ bewirkt, dass sich S1 in S2 verwandelt.
Zeichen „f“S1 ein 🎜>, zu diesem Zeitpunkt S1 = “abcf“, S2 = „def“, zu diesem Zeitpunkt d. h. S1[i] = S2[j] Im Fall von beträgt der Bearbeitungsabstand von S1, umgewandelt in S2, d[4, 3] = d[ 3, 2]. Also erhalten wir d[i, j]=d[i, j - 1] + 1. (+1 liegt daran, dass S1 “f“ hinzugefügt hat) 2 )Einfügen das Zeichen
„c“ am Ende der Zeichenfolge S2, dann S1 = „abc“ , S2 = „defc“, dies ist der Fall von S1[i] = S[j], S1 in S2 ist d[3, 4] = d[2, 3] . Wir erhalten also d[i, j]=d[i - 1, j] + 1 Tatsächlich geschieht dies für S1 Löschen. (+1 liegt daran, dass S2 “c“ hinzugefügt hat) 3 ) Ändern S1
das letzte Zeichen der Zeichenfolge bis “f“, zu diesem Zeitpunkt S1 = "abf" , S2 = "def", zu diesem Zeitpunkt, S1[i] = S[j] Im Fall von beträgt der Bearbeitungsabstand der Transformation von S1 in S2 d[3, 3] = d[2, 2]. Wir erhalten also d[i, j] = d[i – 1, j - 1] + 1. (+1 liegt daran, dass S1 "c" geändert hat) Zusammenfassend erhalten wir die Rekursionsformel:
=>
Sie können genauso gut einen Tisch dazu verwenden Drücken Sie die dynamische Planung aus. Der Lösungsprozess von S1=“abc“, S2=“def“.
Es ist ersichtlich, dass das rote Quadrat der erforderliche endgültige Bearbeitungsabstand ist und der gesamte Lösungsprozess darin besteht, diese Tabelle auszufüllen — —Zweidimensionales Array. Im Folgenden finden Sie die dynamischen Programmierlösungen für den String-Bearbeitungsabstand in Java bzw. Python.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Beispiele für den Bearbeitungsabstand von Zeichenfolgen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!