Dies ist Aufgabe 15.5-4 der Einführung in Algorithmen, 3. Ausgabe, die sich mit Knuths Verbesserung des DP-Ansatzes zum Optimal Binary Search Tree beschäftigt.Dynamische Programmierung: Warum verbessert Knuth den Optimal Binary Search Tree O (n^2)?
Der DP-Algorithmus von Optimal Binary Search Tree ist:
OPTIMAL_BST(p, q, n)
let e[1..n+1, 0..n], w[1..n+1, 0..n], and root[1..n, 1..n] be new tables
for i = 1 to n+1
e[i, i - 1] = q[i - 1];
w[i, i - 1] = q[i - 1];
for l = 1 to n
for i = 1 to n - l + 1
j = i + l - 1
e[i, j] = INFINITY
w[i, j] = w[i, j - 1] + p[j] + q[j]
for r = i to j
t = e[i, r - 1] + e[r + 1, j] + w[i, j]
if t < e[i, j]
e[i, j] = t
root[i, j] = r
return e and root
Die Komplexität ist O (n). Knuth hatte beobachtet, dass root[i, j - 1] <= root[i, j] <= root[i + 1, j]
, so Aufgabe 15.5-4 fragt, um einen O (n) Algorithmus zu implementieren, indem einige Änderungen an dem ursprünglichen Algorithmus vorgenommen werden.
Nun nach einiger Mühe habe ich dies herausgefunden: in der innersten Schleife, ersetzen Sie die Zeile
for r = i to j
mit
for r = r[i, j - 1] to r[i + 1, j]
Dies wird durch diesen Link bewiesen worden: Optimal binary search trees
Allerdings bin ich mir nicht sicher, ob das wirklich O ist (n): da während jeder innersten Schleife der Abstand von r [i, j - 1] zu r [i + 1, j] ist nicht konstant, ich vermute, es ist immer noch O (n).
Also meine Frage ist: Können Sie mir bitte erklären, warum die Verbesserung der DP-Algorithmus ergibt O (n) Komplexität?
PS: Vielleicht habe ich zuerst Knuths Papier gelesen, aber ich habe wirklich im Internet gesucht, aber keinen freien Zugang zum Papier gefunden.
Hallo @SaeedAmiri beide Ihre Antwort und David's richtet sich auf das gleiche Ende. Aus Gründen der Nützlichkeit für andere markiere ich Davids Antwort als akzeptiert. –