Esse é um tipo de pergunta de distância de edição e é muito fácil. Estou com morte cerebral bastante neste assunto e não consigo descobrir até agora.
Dada uma série de números, por exemplo
[3, 1, 1, 1]
Como alguém transformaria todos os números de maneira mais eficiente no mesmo número, com o número mínimo de "movimentos"? "Mover" significa adicionar ou remover um de um número.
No exemplo acima, as jogadas mais eficientes seriam:
[1, 1, 1, 1]
Isso exigiria 2 movimentos, reduzindo o primeiro número duas vezes.
Não consigo descobrir a melhor maneira de descobrir isso, considerando matrizes muito maiores de centenas de números.
Inicialmente, tentei calcular o número médio arredondado (soma de todos os divididos pelo comprimento) e reduzi-los à média calculada, mas o exemplo acima quebrou isso, exigindo 4 movimentos em vez de 2.
Suponho que poderia imaginar:
- A média,
- O modo,
- A mediana
e obtenha a distância de edição de cada um deles, escolhendo a distância mínima. No entanto, não tenho certeza de que isso esteja correto em todas as instâncias. Como posso saber?
fonte
Respostas:
A resposta é levar a mediana. Uma das propriedades da mediana é que ela minimiza a distância L1 de cada elemento. (Para entender o artigo da Wikipedia, considere a distribuição de probabilidade como sendo a distribuição uniforme sobre sua série original de números).
Este é o algoritmo que resolve o problema (originalmente escrito por dc2 ):
fonte
Como o TCSGrad menciona, dada uma lista de números inteiros , você está procurando o número inteiro m que minimiza δ ( m ) = n ∑ i = 1 | m - x i | . É instrutivo calcular δ ( m + 1 ) - δ ( m ) : δ ( m + 1 ) - δ ( m ) =x1,…,xn m
fonte
O problema pode ser formulado como um problema de LP:
EDIT : Como apontado nos comentários, a função objetivo deve ser soma sobre diferenças absolutas. Para transformá-lo novamente em um LP padrão, podemos reescrevê-lo como:
sujeito a:
fonte