La distanza di Hamming tra due stringhe di uguale lunghezza è il numero di posizioni in cui i simboli corrispondenti sono diversi.
Lascia che Psia una stringa binaria di lunghezza ne che Tsia una stringa binaria di lunghezza 2n-1. Possiamo calcolare le ndistanze di Hamming tra Pe tutte le nsottostringhe di Tin ordine da sinistra a destra e metterle in un array (o elenco).
Esempio di sequenza della distanza di Hamming
Let P = 101and 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 xe ysiamo closese y <= x <= 2*yo se x <= y <= 2*x. Qui la moltiplicazione scalare e la disuguaglianza sono prese elementalmente. Vale a dire, per due sequenze Ae 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 xe ynon sono vicini l'uno all'altro.
Compito
Per aumentare a npartire da n=1, considera tutte le possibili coppie di stringhe binarie Pdi lunghezza ne Tlunghezza 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 ntuo 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 nper 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, 21emette e qualcun altro emette, 2, 5, 15si otterrebbe un punteggio solo 1perché qualcun altro ha una risposta migliore n = 2. Se produci un output 2, 5, 21, assegnerai 3un 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 nche 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 = 2in 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 5per n = 2.
Per n = 3l'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 48sequenze, possiamo scegliere un insieme di dimensioni in 21modo 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