Si no te estoy malentendiendo, creo que la factorización de costo mínimo se puede calcular en tiempo siguiente manera.O(n2)
Para cada índice i, calcularemos un grupo de valores para siguiente manera. Supongamos que es el número entero más pequeño de modo que haya un número entero satisfagaPara este particular , deje que sea el más grande con esta propiedad. Si no existe tal , establezca para que sepamos que hay valores cero para este índice.(pℓi,rℓi)ℓ=1,2,…p1i≥1r≥2S[i−rp1i+1,i−p1i]=S[i−(r−1)p1i+1,i].
p1ir1irpiLi=0(pℓi,rℓi)
Deje que sea el entero más pequeño estrictamente más grande que satisfaga, asimismo,
para algunos . Como antes, tome como el máximo que tiene fijo . En general, es el número más pequeño estrictamente más grande que . Si no existe tal , entonces .p2i(r1i−1)p1iS[i−r2ip2i+1,i−p2i]=S[i−(r2i−1)p2i+1,i]
r2i≥2r2ip2ipℓi(rℓ−1i−1)pℓ−1ipℓiLi=ℓ−1
Tenga en cuenta que para cada índice i, tenemos debido a que los valores de aumentan geométricamente con . (si existe , no solo es estrictamente mayor que sino que es mayor que al menos Esto establece el aumento geométrico. )Li=O(log(i+1))pℓiℓpℓ+1i(rℓi−1)pℓipℓi/2
Supongamos que ahora se nos dan todos los valores . El costo mínimo viene dado por la recurrencia
entendiendo que para configuramos . La tabla se puede llenar en tiempo.(pℓi,rℓi)dp(i,j)=min{dp(i,j−1)+1,minℓ(dp(i,j−rℓjpℓj)+dp(j−rℓjpℓj+1,j−pℓj))}
i>jdp(i,j)=+∞O(n2+n∑jLj)
Ya hemos observado anteriormente que al delimitar la suma término por término. Pero en realidad, si miramos la suma total, podemos probar algo más preciso.∑jLj=O(∑jlog(j+1))=Θ(nlogn)
Considere el árbol de sufijos del reverso de (es decir, el árbol de prefijos de S). cada contribución a la suma a un borde de para que cada borde se cargue como máximo una vez. Cargue cada hasta el borde que emana de y vaya hacia . Aquí es la hoja del árbol de prefijos correspondiente a y nca denota el ancestro común más cercano.T(S←)S∑iLiT(S←)pjinca(v(i),v(i−pji))v(i−pji)v(i)S[1..i]
Esto muestra que . Los valores se pueden calcular en el tiempo mediante un recorrido del árbol de sufijos, pero dejaré los detalles para una edición posterior si alguien está interesado.O(∑iLi)=O(n)(pji,rji)O(n+∑iLi)
Avísame si esto tiene sentido.