Si je ne vous comprends pas, je pense que la factorisation du coût minimum peut être calculée en temps comme suit.O(n2)
Pour chaque indice i, nous calculerons un ensemble de valeurs pour comme suit. Soit le plus petit entier tel qu'il existe un entier satisfaisantPour ce , soit le plus grand avec cette propriété. Si aucun n'existe, définissez afin que nous sachions qu'il y a zéro pour cet indice.(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)
Soit le plus petit entier strictement supérieur à satisfaisant, de même,
pour certains . Comme précédemment, prenez pour être le maximum ayant fixé . En général, est le plus petit nombre strictement supérieur à . Si aucun tel n'existe, alors .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
Notez que pour chaque indice i, nous avons car les valeurs de augmentent géométriquement avec . (si existe, il n'est pas seulement strictement plus grand que mais plus grand que celui d'au moins Ceci établit l'augmentation géométrique. )Li=O(log(i+1))pℓiℓpℓ+1i(rℓi−1)pℓipℓi/2
Supposons maintenant que toutes les valeurs nous soient données. Le coût minimum est donné par la récurrence
entendu que pour nous définissons . Le tableau peut être rempli en temps .(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)
Nous avons déjà observé ci-dessus que en délimitant la somme terme par terme. Mais en fait, si nous regardons la somme entière, nous pouvons prouver quelque chose de plus net.∑jLj=O(∑jlog(j+1))=Θ(nlogn)
Considérons l'arbre de suffixe de l'inverse de (c'est-à-dire l'arbre de préfixe de S). Nous facturerons chaque contribution à la somme à un bord de afin que chaque bord soit facturé au plus une fois. Chargez chaque au bord émanant de et allant vers . Ici est la feuille de l'arbre préfixe correspondant à et nca désigne l'ancêtre commun le plus proche.T(S←)S∑iLiT(S←)pjinca(v(i),v(i−pji))v(i−pji)v(i)S[1..i]
Cela montre que . Les valeurs peuvent être calculées dans le temps par une traversée de l'arbre des suffixes mais je laisserai les détails à une édition ultérieure si quelqu'un est intéressé.O(∑iLi)=O(n)(pji,rji)O(n+∑iLi)
Faites-moi savoir si cela a du sens.