Chciałbym wiedzieć, czy istnieje funkcja od liczb n-bitowych do liczb n-bitowych, która ma następujące cechy:
- powinien być bijectywny
- Zarówno i powinny być obliczalne dość szybko
- powinien zwrócić liczbę, która nie ma znaczącej korelacji z wprowadzonymi danymi.
Uzasadnienie jest następujące:
Chcę napisać program działający na danych. Niektóre informacje o danych są przechowywane w drzewie wyszukiwania binarnego, w którym klucz wyszukiwania jest symbolem alfabetu. Z czasem dodałem kolejne symbole do alfabetu. Nowe symbole po prostu uzyskają następny bezpłatny numer. Dlatego drzewo zawsze będzie miało niewielkie odchylenie od mniejszych kluczy, co powoduje większe zrównoważenie, niż myślę, że powinno być potrzebne.
Moim pomysłem jest zmieszanie liczb symboli tak, aby były szeroko rozłożone w całym zakresie . Ponieważ liczby symboli mają znaczenie tylko na wejściu i wyjściu, co dzieje się tylko raz, zastosowanie takiej funkcji nie powinno być zbyt drogie.[ 0 , 2 64 - 1 ]
Myślałem o jednej iteracji generatora liczb losowych Xorshift, ale tak naprawdę nie wiem, jak to cofnąć, chociaż teoretycznie powinno to być możliwe.
Czy ktoś zna taką funkcję?
Czy to dobry pomysł?
źródło
Odpowiedzi:
Możesz użyć skrótu Fibonacciego , a mianowicie
.hF(k)=k⋅5√−12−⌊k⋅5√−12⌋
Dla dostać n liczb parami-wyraźny (o) równomiernie w [ 0 , 1 ] . Skalowanie do [ 1 .. M ] i zaokrąglanie (w dół) pozwala uzyskać równomierne rozłożenie liczb w tym przedziale.k=1,…,n n [0,1] [1..M]
Na przykład są to skalowane do [ 0..10000 ] (lewa pierwotna sekwencja, prawa posortowana):hfa( 1 ) , … , godzfa( 200 ) [ 0..10000 ]
Jest to przykład tego, co Knuth nazywa multiplikatywnym haszowaniem . Dla rozmiarze słowo komputera, niektóre całkowitą stosunkowo prime do wag i M liczby adresów potrzebnych używamyw ZA w M.
jako funkcja mieszająca. Powyżej następuje (upewnij się, że możesz go obliczyć z wystarczającą precyzją). Chociaż działa to również z dowolną inną liczbą niewymierną pozaϕ-1, jest to jedna z dwóch liczb, które prowadzą do liczb „najbardziej równomiernie rozmieszczonych”.A / w = ϕ- 1= 5√- 12) ϕ- 1
Znajdź więcej w The Art of Computer Programming , Tom 3 autorstwa Donalda Knutha (rozdział 6.4 ze strony 513 w drugim wydaniu). W szczególności dowiesz się, dlaczego uzyskane liczby są odrębne parami (przynajmniej jeśli ) i jak obliczyć funkcję odwrotną, jeśli użyjesz naturalnego A i w zamiast ϕ - 1 .n ≪ M. ZA w ϕ- 1
źródło
Dla wejść bit ta funkcja działa:k
Jest to odwracalne, ponieważ , i ma pary niesekwencyjne { n , m } , n < m , gdzie h a s h ( m ) < h a s h ( n ) . Uwaga: dane wyjściowe i wejściowe mogą się korelować, zwłaszcza jeśli dane wejściowe są w { 1 , … , 2 ⌈ kh a s h ( h a s h (n))=n { n , m } , n < m h a s h (m)< h a s h (n) .{ 1 , … , 2⌈ k2)⌉- 1 }
Ref: Odwracalna funkcja skrótu
źródło