A distância de Hamming entre duas cordas de igual comprimento é o número de posições nas quais os símbolos correspondentes são diferentes.
Let P
Ser uma seqüência de comprimento binária n
e T
ser uma seqüência de comprimento binária 2n-1
. Podemos calcular as n
distâncias de Hamming entre P
e cada n
substring de comprimento da T
ordem da esquerda para a direita e colocá-las em uma matriz (ou lista).
Exemplo de seqüência de distância de Hamming
Let P = 101
e T = 01100
. A sequência de distâncias de Hamming que você obtém desse par é 2,2,1
.
Definição de proximidade
Agora vamos considerar duas dessas seqüências de distâncias de Hamming. Diga x = (0, 2, 2, 3, 0)
e y = (2, 1, 4, 4, 2)
como exemplos. Dizemos isso x
e y
somos close
se y <= x <= 2*y
ou se x <= y <= 2*x
. Aqui a multiplicação escalar e a desigualdade são consideradas elementares. Ou seja, para duas seqüências A
e B
, A <= B iff A[i] <= B[i]
para todos os índices i
.
Observe que seqüências de distâncias de Hamming formam uma ordem parcial sob essa maneira de compará-las. Em outras palavras, muitos pares de sequências não são maiores ou iguais nem menores que ou iguais um ao outro. Por exemplo (1,2)
e (2,1)
.
Então, usando o exemplo acima, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
mas (0, 2, 2, 3, 0)
não é maior que (2, 1, 4, 4, 2)
. Também (2, 1, 4, 4, 2)
não é menor ou igual a 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Como resultado x
e y
não estão próximos um do outro.
Tarefa
Para aumentar a n
partir de n=1
, considere todos os pares possíveis de cadeias binárias P
de comprimento n
e T
comprimento 2n-1
. Existem 2^(n+2n-1)
tais pares e, portanto, muitas seqüências de distâncias de Hamming. No entanto, muitas dessas sequências serão idênticas. A tarefa é encontrar o tamanho do maior conjunto de seqüências de distância de Hamming para que não haja duas sequências próximas umas das outras.
Seu código deve gerar um número por valor de n
.
Ponto
Em geral, sua pontuação é a mais alta que n
seu código atinge na minha máquina em 5 minutos (mas continue lendo). O tempo é para o tempo total de execução, não o tempo apenas para essen
.
Para fornecer pontuações para respostas não ideais, porque é provável que seja difícil encontrar respostas ótimas, precisaremos de um sistema de pontuação um pouco sutil. Sua pontuação é o valor mais alto n
para o qual mais ninguém postou uma resposta correta mais alta para qualquer tamanho menor que igual a isso. Por exemplo, se você produzir 2, 4, 21
e alguém produzir 2, 5, 15
, você só pontuará se 1
alguém tiver uma resposta melhor n = 2
. Se você produzir 2, 5, 21
, pontuará, 3
independentemente do resultado de qualquer outra pessoa, porque essas respostas são ótimas. Claramente, se você tiver todas as respostas ideais, obterá a pontuação mais alta que n
você postar. No entanto, mesmo que sua resposta não seja ótima, você ainda pode obter a pontuação se ninguém mais conseguir vencê-la.
Respostas de exemplo e exemplo trabalhado
(Essas respostas ainda estão desmarcadas. A verificação independente seria recebida com gratidão.)
Graças a ETHproductions:
- n = 1 dá 2.
- n = 2 dá 5.
- n = 3 dá 21.
Vamos olhar com n = 2
mais detalhes. Nesse caso, a lista completa de sequências de distâncias de Hamming (representadas por tuplas aqui) é:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Podemos ver que (0,0)
não está perto de nenhuma outra tupla. De fato, se tomarmos (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
em seguida, nenhuma dessas tuplas estão perto de qualquer um dos outros. Isso dá uma pontuação de 5
para n = 2
.
Para n = 3
a lista completa de distintas seqüências de distância de Hamming, consulte:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
Nessas 48
seqüências, podemos escolher um conjunto de tamanho 21
para que nenhum par nesse conjunto esteja próximo um do outro.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis que desejar. Sempre que possível, seria bom poder executar seu código; portanto, inclua uma explicação completa de como executar / compilar seu código no Linux, se possível.
Minha máquina Os tempos serão executados na minha máquina de 64 bits. Esta é uma instalação padrão do ubuntu com 8GB de RAM, processador de oito núcleos AMD FX-8350 e Radeon HD 4250. Isso também significa que eu preciso executar seu código.
Resposta principal
- Pontuação de 4 para 2, 5, 21, 83, 361 por Christian Sievers. C ++
- Pontuação de 5 para 2, 5, 21, 83, 372 por fəˈnɛtɪk. Javascript