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 Pbędzie dwójkowym ciągiem długości ni Tdwójkowym ciągiem długości 2n-1. Możemy obliczyć nodległości Hamminga między podciągiem Pkażdej ndługości Tw kolejności od lewej do prawej i umieścić je w tablicy (lub liście).
Przykład sekwencji odległości Hamminga
Niech P = 101i 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 xi yjesteśmy, closejeśli y <= x <= 2*ylub jeśli x <= y <= 2*x. Tutaj mnożenie skalarne i nierówności są uwzględniane elementarnie. To znaczy, dla dwóch sekwencji Ai 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 xi ynie są blisko siebie.
Zadanie
Aby zwiększyć, nzaczynając od n=1, rozważ wszystkie możliwe pary ciągów binarnych Po długości ni Tdł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 nTwó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ą, ndla 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, 21a ktoś inny wyświetla dane wyjściowe, 2, 5, 15uzyskasz wynik tylko wtedy, 1gdy ktoś inny ma lepszą odpowiedź n = 2. Jeśli wypiszesz wynik, 2, 5, 21uzyskasz wynik 3bez 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ą, nktó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 = 2bardziej 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 5dla n = 2.
Dla n = 3peł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 48sekwencji 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