Слово факторизация за

12

Учитывая две строки S1,S2 , мы пишем S1S2 для их объединения. Учитывая , строка S и целое число k1 , мы будем писать (S)k=SSS для конкатенации k копий S . Теперь, учитывая строку, мы можем использовать эту запись, чтобы «сжать» ее, то есть AABAAB можно записать как ((A)2B)2 . Давайте называть вессжатиячисло символоввходящих в него, так что вес((A)2B2) состоитдвух, а вес(AB)2AкомпрессиейотABABA ) это три (отдельныеA считаются отдельно).

Теперь рассмотрим задачу вычисления «самого легкого» сжатия данной строки S с |S|=n . После некоторых размышлений существует очевидный подход динамического программирования, который выполняется в O(n3logn) или O(n3) зависимости от точного подхода.

Однако мне сказали, что эта проблема может быть решена за O(n2logn) , хотя я не могу найти источники о том, как это сделать. В частности, эта проблема была поставлена ​​в недавнем конкурсе по программированию (проблема K здесь , последние две страницы). Во время анализа был представлен алгоритм O(n3logn) , и в конце была упомянута псевдоквадратичная граница ( здесь, на отметке четыре минуты). К сожалению, докладчик упомянул только «сложную лемму о комбинаторике слов», поэтому теперь я пришел сюда, чтобы попросить решение :-)

Тимон Книгге
источник
SS=Xa=Yb Z gcd ( | X | , | Y | ) X Y S = X a S Y S = Y b Y X | X |S=Z|S|/gcd(|X|,|Y|)Zgcd(|X|,|Y|)XYS=XaSYS=Yb, тогда вам нужно всего лишь попробовать префиксы of имеющие длину, которая делит, YX|X|
j_random_hacker
Проблема заключается в том, что даже после уменьшения всех возможных вам все равно необходимо агрегировать ответ кубическим DP по подсегментам (т. ), так что после этого еще предстоит проделать дополнительную работу ... D P [ l , r ] = min k D P [ l , k ] + D P [ k + 1 , r ]XaDP[l,r]=minkDP[l,k]+DP[k+1,r]
Тимон Книгге
Я понимаю что ты имеешь ввиду. Я думаю, что вам нужно какое-то отношение доминирования, которое исключает необходимость тестирования некоторых значений но я не смог придумать одно. В частности, я рассмотрел следующее: предположим, что имеет оптимальную факторизацию с ; возможно ли, что существует оптимальное решение, в котором как с ? К сожалению, ответ да: для , имеет оптимальную факторизации , но единственная оптимальная факторизация для является .S [ 1 .. i ] S [ 1 .. i ] = X Y k k > 1 S X Y j Z j < k S = A B A B C A B C S [kS[1..i]S[1..i]=XYkk>1SXYjZj<kS=ABABCABC( A B ) 2 S A B ( A B C ) 2S[1..4](AB)2SAB(ABC)2
j_random_hacker

Ответы:

1

Если я вас не правильно понял, я думаю, что минимальная факторизация затрат может быть рассчитана за раз следующим образом.O(n2)

Для каждого индекса i мы вычислим группу значений для следующим образом. Пусть - наименьшее целое число, так что существует целое число удовлетворяющееДля этого конкретного , пусть будет наибольшим с этим свойством. Если такого существует, установите чтобы мы знали, что для этого индекса есть нулевые значения.(pi,ri)=1,2,pi11r2

S[irpi1+1,ipi1]=S[i(r1)pi1+1,i].
pi1ri1rpiLi=0(pi,ri)

Пусть будет наименьшим целым числом, строго большим, чем удовлетворяющим также для некоторого . Как и прежде, возьмите как максимальное значение с фиксированным . В общем случае является наименьшим таким числом, строго большим, чем . Если такого существует, то .pi2(ri11)pi1

S[iri2pi2+1,ipi2]=S[i(ri21)pi2+1,i]
ri22ri2pi2pi(ri11)pi1piLi=1

Обратите внимание, что для каждого индекса i мы имеем из-за геометрического увеличения значений с . (если существует, он не просто строго больше, чем но больше, чем по крайней мере на Это устанавливает геометрическое увеличение. )Li=O(log(i+1))pipi+1(ri1)pipi/2

Предположим теперь, что все значения даны нам. Минимальная стоимость определяется как повторение с пониманием, что для мы устанавливаем . Таблица может быть заполнена за времени.(pi,ri)

dp(i,j)=min{dp(i,j1)+1,min(dp(i,jrjpj)+dp(jrjpj+1,jpj))}
i>jdp(i,j)=+O(n2+njLj)

Выше мы уже отмечали, что , ограничивая член суммой членом. Но на самом деле, если мы посмотрим на всю сумму, мы можем доказать что-то острее.jLj=O(jlog(j+1))=Θ(nlogn)

Рассмотрим дерево суффиксов обратной стороны (т. Дерево префиксов S). Мы будем взимать каждый вклад в сумму с ребра чтобы каждое ребро было начислено не более одного раза. Зарядите каждый к краю, исходящему из и идущему к . Здесь - лист дерева префиксов, соответствующий а nca обозначает ближайшего общего предка.T(S)SiLiT(S)pijnca(v(i),v(ipij))v(ipij)v(i)S[1..i]

Это показывает, что . Значения могут быть рассчитаны за время путем обхода дерева суффиксов, но я оставлю детали для последующего редактирования, если кому-то будет интересно.O(iLi)=O(n)(pij,rij)O(n+iLi)

Дайте мне знать, если это имеет смысл.

Мерт Сахлам
источник
-1

Есть ваша начальная строка S длины n. Вот псевдокод метода.

next_end_bracket = n
for i in [0:n]: # main loop

    break if i >= length(S) # due to compression
    w = (next_end_bracket - i)# width to analyse

    for j in [w/2:0:-1]: # period loop, look for largest period first
        for r in [1:n]: # number of repetition loop
            if i+j*(r+1) > w:
                break r loop

            for k in [0:j-i]:
                # compare term to term and break at first difference
                if S[i+k] != S[i+r*j+k]:
                    break r loop

        if r > 1:
            # compress
            replace S[i:i+j*(r+1)] with ( S[i:i+j] )^r
            # don't forget to record end bracket...
            # and reduce w for the i-run, carrying on the j-loop for eventual smaller periods. 
            w = j-i

Я намеренно дал немного подробностей о «конечных скобках», так как для стека и разборки нужно много шагов, что не позволило бы понять основной метод. Идея состоит в том, чтобы проверить возможное дальнейшее сокращение внутри первого. для примера ABCBCABCBC => (ABCBC) ² => (A (BC) ²) ².

Поэтому главное - сначала поискать большие периоды. Обратите внимание, что S [i] - это i-й член S, пропускающий любое "(", ")" или степень.

  • i-цикл - это O (n)
  • J-петля является O (N)
  • r + k-loop равен O (log (n)), так как он останавливается при первой разнице

Это глобально O (n²log (n)).

Optidad
источник
Мне не ясно, что петли r и k равны O (log n) - даже отдельно. Что гарантирует, что различие будет найдено после максимум O (log n) итераций?
j_random_hacker
Я правильно понимаю, что вы жадно сжимаете? Поскольку это неверно, рассмотрим, например, ABABCCCABCCC, который вы должны разложить на AB (ABC ^ 3) ^ 2.
Тимон Книгге
Да, вы абсолютно правы, я должен подумать об этом.
Optidad