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 PSer uma seqüência de comprimento binária ne Tser uma seqüência de comprimento binária 2n-1. Podemos calcular as ndistâncias de Hamming entre Pe cada nsubstring de comprimento da Tordem da esquerda para a direita e colocá-las em uma matriz (ou lista).
Exemplo de seqüência de distância de Hamming
Let P = 101e 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 xe ysomos closese y <= x <= 2*you se x <= y <= 2*x. Aqui a multiplicação escalar e a desigualdade são consideradas elementares. Ou seja, para duas seqüências Ae 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 xe ynão estão próximos um do outro.
Tarefa
Para aumentar a npartir de n=1, considere todos os pares possíveis de cadeias binárias Pde comprimento ne Tcomprimento 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 nseu 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 npara 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, 21e alguém produzir 2, 5, 15, você só pontuará se 1alguém tiver uma resposta melhor n = 2. Se você produzir 2, 5, 21, pontuará, 3independentemente 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 nvocê 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 = 2mais 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 5para n = 2.
Para n = 3a 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 48seqüências, podemos escolher um conjunto de tamanho 21para 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