Complexidade de homogeneizar uma corda

10

Motivação : Ao desenvolver ferramentas para controle de versão de dados, acabamos analisando algoritmos para "diferenciar" dois conjuntos de números inteiros, criando uma sequência de transformações que levam um conjunto de números inteiros para o outro. Conseguimos reduzir esse problema ao seguinte problema muito natural que parece ter conexões para editar a distância, o agrupamento por troca e a partição mínima comum de cadeias .

Problema : recebemos uma sequência, ou seja, uma sequência de letras, e nosso objetivo é homogeneizá- la a um custo mínimo. Ou seja, queremos uma sequência reorganizada de modo que todas as letras iguais sejam próximas uma da outra.

A única operação permitida é pegar uma subsequência de letras iguais e mover essa subsequência para qualquer lugar, e isso me custa 1 unidade.

Qualquer ajuda para caracterizar a complexidade desse problema seria muito apreciada!

Exemplo :

  • aabcdab: Input
  • bcd aa ab: Depois de mover o primeiro aa para a posição logo após "d"
  • b bcdaaa: Depois de mover o b final para a primeira posição

Como a sequência resultante é homogênea, temos um custo de 2.

Observe que não somos limitados de maneira alguma com relação à saída: contanto que seja homogênea, não precisamos garantir nenhuma ordem específica.

Aditya Parameswaran
fonte

Respostas:

6

Esse problema é NP-completo, por redução do conjunto mínimo de acertos .

No mínimo bater conjunto, nos é dado um universo, , e um conjunto de conjuntos S tal que s S , s U . O objectivo é encontrar H L de menor tamanho tal que s S , h H tal que H s .vocêSsS,svocêHvocêsS,hHhs

A redução é a seguinte:

  • A cadeia é a seguinte: Para cada elemento , haverá dois caracteres da cadeia, u . Entre esses personagens vão um personagem s ' para cada s S tal que u s . Entre os pares de u ' s, haverá personagens únicos que não são utilizadas na string.vocêvocêvocêssSvocêsvocê

  • Para homogeneizar a sequência, o caractere deve ser movido | s | - 1 vezes, para cada s . Além disso, para cada u , o caractere u ' deve ser movido uma vez, a menos que todos os s ' entre o par de u ' tenham sido movidos para outro local.s|s|-1 1svocêvocêsvocê

  • Portanto, para minimizar o número de movimentos necessários para homogeneizar a cadeia, desejamos maximizar o número de modo que cada s ' tenha sido movido para outro lugar. O u ' é onde os s ' s não foram transferidos para outros locais devem juntos contêm um s ' para cada s S , então eles devem para um conjunto de bater. Além disso, qualquer conjunto de bater pode servir como os locais término do s ' s, movendo cada um s ao u que atinge.vocêsvocêsssSssvocê

  • Portanto, o número de movimentos para homogeneizar essa sequência é igual a , onde H é o conjunto de batidas mínimo.|s|+|H|H

Como o conjunto mínimo de batidas é NP-Hard, também é ideal a homogeneização ideal de uma string. Como os movimentos formam uma testemunha, é NP-Complete.

isaacg
fonte
Esta é uma redução elegante - obrigado!
Aditya Parameswaran
2

Observe o número de alterações de uma letra para outra na sua string, que você pode ver como uma medida para a falta de homogeneidade da string. Com cada movimento (útil) de uma subsequência, você reduz esse número em um se a subsequência que você move é precedida e seguida por duas letras distintas. Caso contrário, você reduz a inomogeneidade em dois.

Portanto, para uma string com k alterações, você precisa no máximo k - l + 1 se mover onde l é o número de letras diferentes na string, porque no final l - 1 as alterações permanecerão. Como uma cadeia de comprimento n pode ter no máximo n-1 letra alterada, pode precisar de no máximo n-l movimentos. O número menos possível é metade disso.

A melhor estratégia parece, portanto, procurar subsequências da forma abbba e afastar o bbb de lá. Quando não sobrar, mova o que for. Você ainda pode tentar fazer as operações que criam novas situações de abbba, mas acho que o ganho será muito pequeno. Como a pior estratégia possível (sem movimentos tolos que aumentam a falta de homogeneidade) usa no máximo o dobro de movimentos que o ideal, o pouco que você pode ganhar parece não ter uma relação razoável com o esforço, como a resposta de isaacg com a caracterização como NP-difícil sugere. A menos, é claro, que você realmente conte apenas o número de operações de movimentação e não se importe com o tempo para decidir quais movimentos serão feitos.

O pior caso é, portanto, uma string em que cada letra é diferente de seu antecessor (e você não recebe nenhum bônus da abbba). Aqui você precisa de várias operações lineares no comprimento da string e quase iguais a esse comprimento.

No seu exemplo, você tem 5 -> 4 -> 3 alterações e 3 é igual ao número de letras (4) menos 1.

Nota lateral: para um alfabeto de tamanho apenas dois, todo movimento que não move um prefixo ou sufixo da sequência reduz a inomogeneidade em dois e, portanto, toda sequência de movimentos razoáveis ​​é ideal.

Peter Leupold
fonte
Você alega que uma movimentação pode reduzir o número de alterações em no máximo 2, mas na verdade pode reduzir o número de alterações em até 3. Por exemplo, convertendo "aabcabc" em "aaabbcc" movendo a primeira subcadeia "bc" para a meio da segunda substring resultados "BC" em uma diminuição do número de mudanças na cadeia de 5 a 2.
Mikhail Rudoy
Olá, @MikhailRudoy. As perguntas afirmam que a operação é "pegar uma subsequência de letras iguais", então bc não é permitido até onde eu entendo.
22826 Peter Leupold
Perdi completamente esse detalhe. Você está correto nesse caso.
Mikhail Rudoy
Peter está correto: esses movimentos não são permitidos.
Aditya Parameswaran
Re: o restante da resposta - na verdade, essas observações são: limites inferiores, otimização do tamanho do alfabeto 2 e heurísticas para o que fazer a qualquer momento são valiosas. Como qualquer movimento na pior das hipóteses beneficia apenas essa sequência de letras e, na melhor das hipóteses, mescla no máximo duas seqüências de letras, como no seu abbba, uma aproximação 2 parece natural.
Aditya Parameswaran