La distanza di Hamming tra due stringhe di uguale lunghezza è il numero di posizioni in cui i simboli corrispondenti sono diversi.
Lascia che P
sia una stringa binaria di lunghezza n
e che T
sia una stringa binaria di lunghezza 2n-1
. Possiamo calcolare le n
distanze di Hamming tra P
e tutte le n
sottostringhe di T
in ordine da sinistra a destra e metterle in un array (o elenco).
Esempio di sequenza della distanza di Hamming
Let P = 101
and T = 01100
. La sequenza delle distanze di Hamming che ottieni da questa coppia è 2,2,1
.
Definizione di vicinanza
Consideriamo ora due di queste sequenze di distanze di Hamming. Dire x = (0, 2, 2, 3, 0)
e y = (2, 1, 4, 4, 2)
come esempi. Lo diciamo x
e y
siamo close
se y <= x <= 2*y
o se x <= y <= 2*x
. Qui la moltiplicazione scalare e la disuguaglianza sono prese elementalmente. Vale a dire, per due sequenze A
e B
, A <= B iff A[i] <= B[i]
per tutti gli indici i
.
Si noti che le sequenze delle distanze di Hamming formano un ordine parziale in questo modo di confrontarle. In altre parole, molte coppie di sequenze non sono né maggiori né uguali né minori o uguali tra loro. Ad esempio (1,2)
e (2,1)
.
Quindi usando l'esempio sopra, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
ma (0, 2, 2, 3, 0)
non è più grande di (2, 1, 4, 4, 2)
. Inoltre (2, 1, 4, 4, 2)
non è inferiore o uguale a 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Di conseguenza x
e y
non sono vicini l'uno all'altro.
Compito
Per aumentare a n
partire da n=1
, considera tutte le possibili coppie di stringhe binarie P
di lunghezza n
e T
lunghezza 2n-1
. Esistono 2^(n+2n-1)
coppie del genere e quindi molte sequenze di distanze di Hamming. Tuttavia, molte di queste sequenze saranno identiche. Il compito è quello di trovare la dimensione del set più grande di sequenze di distanza di Hamming in modo che non vi siano due sequenze vicine l'una all'altra.
Il tuo codice dovrebbe generare un numero per valore di n
.
Punto
Il tuo punteggio è sostanzialmente il più alto che il n
tuo codice raggiunge sulla mia macchina in 5 minuti (ma continua a leggere). Il tempismo è per il tempo di esecuzione totale, non solo per quello n
.
Al fine di dare punteggi per risposte non ottimali, poiché è probabile che trovare risposte ottimali sia difficile, avremo bisogno di un sistema di punteggio leggermente sottile. Il tuo punteggio è il valore più alto n
per il quale nessun altro ha pubblicato una risposta corretta più alta per qualsiasi dimensione inferiore a uguale a questa. Ad esempio, se si 2, 4, 21
emette e qualcun altro emette, 2, 5, 15
si otterrebbe un punteggio solo 1
perché qualcun altro ha una risposta migliore n = 2
. Se produci un output 2, 5, 21
, assegnerai 3
un punteggio a prescindere da ciò che qualcun altro produce perché quelle risposte sono tutte ottimali. Chiaramente se hai tutte le risposte ottimali otterrai il punteggio per il punteggio più alto n
che pubblichi . Tuttavia, anche se la tua risposta non è ottimale, puoi comunque ottenere il punteggio se nessun altro può batterlo.
Esempio di risposte ed esempio funzionato
(Questa risposta è ancora deselezionata. Una verifica indipendente verrebbe ricevuta con gratitudine.)
Grazie a ETHproductions:
- n = 1 dà 2.
- n = 2 dà 5.
- n = 3 dà 21.
Diamo un'occhiata n = 2
in modo più dettagliato. In questo caso l'elenco completo delle sequenze della distanza di Hamming (qui rappresentate dalle tuple) è:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Possiamo vedere che (0,0)
non è vicino a nessun'altra tupla. Infatti se prendiamo (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
allora nessuno di questi tuple sono vicini ad uno qualsiasi degli altri. Questo dà un punteggio di 5
per n = 2
.
Per n = 3
l'elenco completo delle distinte sequenze della distanza di Hamming è:
[(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)]
Di queste 48
sequenze, possiamo scegliere un insieme di dimensioni in 21
modo che nessuna coppia in quell'insieme sia ravvicinata.
Lingue e biblioteche
Puoi utilizzare qualsiasi lingua e libreria disponibili. Laddove possibile, sarebbe opportuno poter eseguire il codice, quindi includere una spiegazione completa su come eseguire / compilare il codice in Linux, se possibile.
La mia macchina I tempi verranno eseguiti sulla mia macchina a 64 bit. Questa è un'installazione Ubuntu standard con 8 GB di RAM, processore AMD FX-8350 Eight-Core e Radeon HD 4250. Ciò significa anche che devo essere in grado di eseguire il codice.
Risposta principale
- Punteggio di 4 per 2, 5, 21, 83, 361 di Christian Sievers. C ++
- Punteggio di 5 per 2, 5, 21, 83, 372 di fəˈnɛtɪk. Javascript