Mam kilka milionów wartości 32-bitowych. Dla każdej wartości chcę znaleźć wszystkie inne wartości w odległości Hamminga wynoszącej 5. W podejściu naiwnym wymaga to porównań , których chcę uniknąć.
Uświadomiłem sobie, że jeśli potraktowałem te 32-bitowe wartości jako liczby całkowite i posortowałem listę raz, to wartości, które różniły się tylko najmniej znaczącymi bitami, były bardzo blisko siebie. To pozwala mi mieć krótsze „okno” lub zakres liczb, w którym mogę wykonać rzeczywiste porównania par dla dokładnej odległości uderzenia. Jednak gdy 2 wartości różnią się tylko bitami wyższego rzędu, kończą się poza tym „oknem” i pojawiają się na przeciwnych końcach posortowanej listy. Na przykład
11010010101001110001111001010110
01010010101001110001111001010110
byłoby bardzo daleko od siebie, nawet jeśli ich odległość uderzenia wynosi 1. Ponieważ odległość uderzenia między 2 wartościami jest zachowana, gdy obie są obracane, pomyślałem, że wykonując 32 obroty w lewo, a następnie sortując listę za każdym razem, prawdopodobne jest, że 2 wartości skończy wystarczająco blisko na posortowanej liście w co najmniej jednym z nich.
Chociaż to podejście daje mi dobre wyniki, staram się formalnie ustalić poprawność tego podejścia.
Biorąc pod uwagę, że szukam pasujących wartości o odległości uderzenia lub mniejszej, czy naprawdę muszę wykonywać wszystkie 32-bitowe obroty? Na przykład, jeśli a mój rozmiar okna wynosi 1000, muszę to robić przy maks. 24-bitowych obrotach, ponieważ nawet jeśli bit zbłąkany pojawił się w jednym z 8 bitów niższego rzędu, uzyskane liczby nie będą się różnić o więcej niż 1000.