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.
A[i].close
Odpowiedzi:
Jak powiedziano, twoje podejście jest problematyczne, ponieważ jeśli 2 bitmapy mają równomiernie rozmieszczone różnice, to przy każdym obrocie będą różnice na niektórych bitach wyższego rzędu.
Dodatkowe informacje:
źródło
odpowiedź minara jest doskonała i prawdopodobnie jest właściwym podejściem do tego konkretnego problemu. Wymienię jednak jeszcze jedno możliwe podejście:
Możesz użyć funkcji skrótu wrażliwej na lokalizację (LSH). Wrażliwa na lokalizację funkcja skrótu została zaprojektowana w taki sposób, że jeśli są bliskie odległości Hamminga, to . Jeśli masz taki skrót , możesz zapisać wszystkie wartości w tabeli skrótów (używając funkcji skrótu i otwartego skrótu ), a następnie bardzo szybko będziesz w stanie znaleźć wszystkie pary wartości, które są bliskie w odległości Hamminga . Istnieją różne techniki konstruowania LSH; możesz przejrzeć odniesienia do tego tematu, aby znaleźć kilku kandydatów.x , y H ( x ) = H ( y ) H HH x,y H(x)=H(y) H H
To powiedziawszy, dla twojego konkretnego problemu (z określonymi parametrami, o których wspomniałeś), oczekuję, że dwa algorytmy minara okażą się lepsze w praktyce niż jakikolwiek schemat oparty na LSH. Wspominam o tym tylko w przypadku, gdy inni czytelnicy przychodzą tutaj na to pytanie z podobnym problemem, ale z różnymi parametrami, w których LSH może mieć większy sens.
źródło