Załóżmy, że mamy czarną skrzynkę którą możemy wyszukać i zresetować. Kiedy przywrócić stan o ma wartość pierwiastka wybranego losowo równomiernie ze zbioru
gdzie jest ustalone i znane dla danego . Do zapytania , element (przypuszczenie) z
jest podany, a zwracana wartość to . Ponadto stan dla jest ustawiony na wartość , gdzie jest wybierane losowo równomiernie z
Wykonując jednolicie losowe domysły przy każdym zapytaniu, należałoby się spodziewać domysłów przed uzyskaniem , z wariancją (podane bez dowodu).
Czy można zaprojektować algorytm, aby działał lepiej (tzn. Robił mniej domysłów, być może z mniejszą zmiennością liczby domysłów)? O ile lepiej mógłby to zrobić (tj. Jaki jest optymalny algorytm i jaka jest jego wydajność)?
Skuteczne rozwiązanie tego problemu może mieć istotne implikacje oszczędnościowe podczas strzelania do królika (ograniczonego do przeskakiwania na okrągłym torze) w ciemnym pokoju.
Odpowiedzi:
Po pierwsze, zakładam, że do
masz na myśli
W przeciwnym razie nie jest całkowicie jasne, czy zawsze obowiązuje i jak dokładnie .fS∈{0,...,n−1} fS±k
Dzięki temu problem sprowadza się do „zagubienia jak najwięcej”. Zauważ, że im bliżej strzelamy do królika, tym większy robi chmiel; w skrajnym przypadku mamy . Powoduje to jednolity przeskok między i , co w zasadzie całkowicie ponownie losowo ustawia pozycję królika. Z drugiej strony, jeśli przegapimy tak bardzo, jak to możliwe - przesunięcie o , królik faktycznie się nie rusza (!), A czarna skrzynka faktycznie nas aktualizuje na ten fakt. Dlatego możemy po prostu odwrócić się i zastrzelić królika.fS−x=±1modn −(⌊n/2⌋±1) (⌊n/2⌋±1) fS−xmodn=⌊n/2⌋
Pozostaje nam znalezienie procedury zaginięcia w każdym ujęciu. Proponuję proste „wyszukiwanie binarne”. (Dogodnie pominę zaokrąglenie.) Postępuje z grubsza w następujący sposób:
Każdy krok wymaga spodziewanego czasu do sukcesu i zmniejsza o połowę przestrzeń wyszukiwania, dając ogólną oczekiwaną liczbę .2=O(1) O(logn)
źródło