Odległość Hamminga pomiędzy dwa ciągi o równej długości jest numer pozycji, w którym odpowiednie symbole są różne.
Niech P
będzie dwójkowym ciągiem długości n
i T
dwójkowym ciągiem długości 2n-1
. Możemy obliczyć n
odległości Hamminga między podciągiem P
każdej n
długości T
w kolejności od lewej do prawej i umieścić je w tablicy (lub liście).
Przykład sekwencji odległości Hamminga
Niech P = 101
i T = 01100
. Sekwencja odległości Hamminga uzyskana z tej pary to 2,2,1
.
Definicja bliskości
Rozważmy teraz dwie takie sekwencje odległości Hamminga. Powiedz x = (0, 2, 2, 3, 0)
i y = (2, 1, 4, 4, 2)
jako przykłady. Mówimy to x
i y
jesteśmy, close
jeśli y <= x <= 2*y
lub jeśli x <= y <= 2*x
. Tutaj mnożenie skalarne i nierówności są uwzględniane elementarnie. To znaczy, dla dwóch sekwencji A
i B
, A <= B iff A[i] <= B[i]
dla wszystkich indeksów i
.
Zauważ, że sekwencje odległości Hamminga tworzą częściowy porządek w ten sposób ich porównywania. Innymi słowy, wiele par sekwencji nie jest ani większych, ani równych, ani mniejszych ani równych sobie. Na przykład (1,2)
i (2,1)
.
Korzystając z powyższego przykładu, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
ale (0, 2, 2, 3, 0)
nie jest większy niż (2, 1, 4, 4, 2)
. Również (2, 1, 4, 4, 2)
nie jest mniejszy ani równy 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. W rezultacie x
i y
nie są blisko siebie.
Zadanie
Aby zwiększyć, n
zaczynając od n=1
, rozważ wszystkie możliwe pary ciągów binarnych P
o długości n
i T
długości 2n-1
. Istnieją 2^(n+2n-1)
takie pary, a zatem wiele sekwencji odległości Hamminga. Jednak wiele z tych sekwencji będzie identycznych. Zadanie polega na znalezieniu rozmiaru największego zestawu sekwencji odległości Hamminga, aby żadne dwie sekwencje nie były blisko siebie.
Twój kod powinien wypisywać jedną liczbę na wartość n
.
Wynik
Twój wynik jest ogólnie najwyższy, jaki n
Twój kod osiąga na moim komputerze w ciągu 5 minut (ale czytaj dalej). Czas dotyczy całkowitego czasu działania, a nie tylko tego czasu n
.
Aby uzyskać wyniki dla nieoptymalnych odpowiedzi, ponieważ znalezienie optymalnych odpowiedzi może być trudne, potrzebujemy nieco subtelnego systemu punktacji. Twój wynik jest najwyższą wartością, n
dla której nikt inny nie opublikował wyższej poprawnej odpowiedzi dla dowolnego rozmiaru, który jest mniejszy niż równy. Na przykład, jeśli wyprowadzasz dane wyjściowe, 2, 4, 21
a ktoś inny wyświetla dane wyjściowe, 2, 5, 15
uzyskasz wynik tylko wtedy, 1
gdy ktoś inny ma lepszą odpowiedź n = 2
. Jeśli wypiszesz wynik, 2, 5, 21
uzyskasz wynik 3
bez względu na to, co ktoś wypisze, ponieważ wszystkie te odpowiedzi są optymalne. Oczywiście, jeśli masz wszystkie optymalne odpowiedzi, otrzymasz wynik za najwyższą, n
którą opublikujesz. Jednak nawet jeśli twoja odpowiedź nie jest optymalna, nadal możesz uzyskać wynik, jeśli nikt inny go nie pokona.
Przykładowe odpowiedzi i działający przykład
(Te odpowiedzi są jeszcze niezaznaczone. Niezależna weryfikacja byłaby wdzięczna).
Dzięki ETHproductions:
- n = 1 daje 2.
- n = 2 daje 5.
- n = 3 daje 21.
Spójrzmy n = 2
bardziej szczegółowo. W tym przypadku pełna lista sekwencji odległości Hamminga (reprezentowana tutaj przez krotki) to:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Widzimy, że (0,0)
nie jest to zbliżone do żadnej innej krotki. W rzeczywistości, jeśli weźmiemy (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
to żaden z tych krotek są zbliżone do żadnej z pozostałych. Daje to wynik 5
dla n = 2
.
Dla n = 3
pełnej listy odrębnych sekwencji odległość Hamminga jest:
[(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)]
Z tych 48
sekwencji możemy wybrać zestaw wielkości 21
, aby żadna para w tym zestawie nie była blisko siebie.
Języki i biblioteki
Możesz użyć dowolnego dostępnego języka i bibliotek, które ci się podobają. Tam, gdzie jest to wykonalne, dobrze byłoby móc uruchomić kod, więc proszę podać pełne wyjaśnienie, jak uruchomić / skompilować kod w systemie Linux, jeśli to w ogóle możliwe.
Moja maszyna Czasy zostaną uruchomione na moim komputerze 64-bitowym. Jest to standardowa instalacja ubuntu z 8 GB pamięci RAM, ośmiordzeniowym procesorem AMD FX-8350 i Radeon HD 4250. Oznacza to również, że muszę mieć możliwość uruchomienia kodu.
Wiodąca odpowiedź
- Wynik 4 dla 2, 5, 21, 83, 361 autorstwa Christiana Sieversa. C ++
- Ocena 5 dla 2, 5, 21, 83, 372 przez fəˈnɛtɪk. JavaScript