Questo è l'esercizio 15.5-4 di Introduction to Algorithms, 3a edizione, che tratta del miglioramento di Knuth rispetto all'approccio DP a Optimal Binary Search Tree.Programmazione dinamica: Perché il miglioramento di Knuth nell'albero di ricerca binaria ottimale O (n^2)?
L'algoritmo DP di Optimal Binary Search Tree è:
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
La complessità è O (n). Knuth aveva osservato che root[i, j - 1] <= root[i, j] <= root[i + 1, j]
, quindi l'esercizio 15.5-4 richiede di implementare un algoritmo O (n) apportando alcune modifiche all'algoritmo originale.
Beh, dopo qualche sforzo ho capito questo: nel ciclo più interno, sostituire la linea
for r = i to j
con
for r = r[i, j - 1] to r[i + 1, j]
Questo è stato dimostrato da questo link: Optimal binary search trees
Tuttavia, non sono sicuro che sia davvero O (n): poiché durante ogni ciclo più interno, la distanza da r [i, j - 1] a r [i + 1, j] non è costante, ho il sospetto che sia ancora O (n).
Quindi la mia domanda è: può spiegarmi perché il miglioramento dell'algoritmo DP produce O (n) complessità?
PS: Forse avrei potuto leggere prima il lavoro di Knuth, ma in realtà ho cercato nel web ma non ho trovato alcun accesso gratuito al giornale.
Ciao @SaeedAmiri sia la tua risposta sia quella di David si dirigono verso la stessa fine. Per motivi di utilità per gli altri, segnalo come risposta la risposta di David. –