Если я вас не правильно понял, я думаю, что минимальная факторизация затрат может быть рассчитана за раз следующим образом.O(n2)
Для каждого индекса i мы вычислим группу значений для следующим образом. Пусть - наименьшее целое число, так что существует целое число удовлетворяющееДля этого конкретного , пусть будет наибольшим с этим свойством. Если такого существует, установите чтобы мы знали, что для этого индекса есть нулевые значения.(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)
Пусть будет наименьшим целым числом, строго большим, чем удовлетворяющим также
для некоторого . Как и прежде, возьмите как максимальное значение с фиксированным . В общем случае является наименьшим таким числом, строго большим, чем . Если такого существует, то .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
Обратите внимание, что для каждого индекса i мы имеем из-за геометрического увеличения значений с . (если существует, он не просто строго больше, чем но больше, чем по крайней мере на Это устанавливает геометрическое увеличение. )Li=O(log(i+1))pℓiℓpℓ+1i(rℓi−1)pℓipℓi/2
Предположим теперь, что все значения даны нам. Минимальная стоимость определяется как повторение
с пониманием, что для мы устанавливаем . Таблица может быть заполнена за времени.(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)
Выше мы уже отмечали, что , ограничивая член суммой членом. Но на самом деле, если мы посмотрим на всю сумму, мы можем доказать что-то острее.∑jLj=O(∑jlog(j+1))=Θ(nlogn)
Рассмотрим дерево суффиксов обратной стороны (т. Дерево префиксов S). Мы будем взимать каждый вклад в сумму с ребра чтобы каждое ребро было начислено не более одного раза. Зарядите каждый к краю, исходящему из и идущему к . Здесь - лист дерева префиксов, соответствующий а nca обозначает ближайшего общего предка.T(S←)S∑iLiT(S←)pjinca(v(i),v(i−pji))v(i−pji)v(i)S[1..i]
Это показывает, что . Значения могут быть рассчитаны за время путем обхода дерева суффиксов, но я оставлю детали для последующего редактирования, если кому-то будет интересно.O(∑iLi)=O(n)(pji,rji)O(n+∑iLi)
Дайте мне знать, если это имеет смысл.