Algorytm Grovera służy między innymi do wyszukiwania elementu na nieuporządkowanej liście elementów o długości . Mimo że jest tu wiele pytań dotyczących tego tematu, nadal nie rozumiem tego.
Przeszukiwanie listy, klasyczny sposób
Zwykle zaprojektowałbym funkcję wyszukiwania w ten sposób
Więc podaję listę i poszukiwany element jako dane wejściowe i otrzymuję pozycję pozycji na liście jako danych wyjściowych. Chyba się, że informacje o jest osadzony w algorytmie przez wyrocznią bramy , dlatego naszym funkcją staje
Zróbmy praktyczny przykład. Rozważ przeszukanie asa pik
Lista długości to .
Poszukiwany element to . Powinienem uzyskać . Każda karta może być kodowana za pomocą bitów, lista ma elementów, więc potrzebujemy bitów do zakodowania listy. W tym przypadku wyrocznia zaimplementuje funkcję:
Jednak wejście algorytmu Grovera nie jest stanem kubitów.
(Uwaga: zdjęcie tasowanej talii jest pobierane stąd )
Grover i jego wyrocznia
Kilka źródeł (np. Tutaj - wyjaśnione graficznie) mówi, że dane wejściowe algorytmu są różne: dane wejściowe to stan pobrany z przestrzeni wyszukiwania gdzie jest liczbą elementów listy. Każdy numer odpowiada pozycji elementu na liście.
Wejście jest teraz wektor , który musi być superpozycją wszystkich elementów w przestrzeni wyszukiwania .
Wiemy
- odpowiada ;
- odpowiada;
- odpowiada ;
- odpowiada który to element dobre;
- i tak dalej...
W tym przypadku mamy
Zbudowanie wyroczni wymaga od nas wiedzy, że jest na pozycji 5. Jaki jest sens wykonania algorytmu, jeśli szukaliśmy już elementu w celu zbudowania wyroczni?
źródło
Odpowiedzi:
Jeśli masz 8 pozycji na liście (jak w przykładzie twojej karty), wtedy wejście wyroczni to 3 (qu) bity. Liczba kart w talii (52) jest nieistotna, potrzebujesz tylko 3 bitów, aby zakodować 8 kart.
Możesz pomyśleć, że 3 bity kodują pozycję na liście szukanej karty; wtedy nie znacie pozycji, ale wyrocznia wie. Więc jeśli szukasz asa pik, wyrocznia wie, że as pik jest szóstą kartą (lub piątą licząc od zera) i implementuje funkcję
PS: Lepiej jest inaczej myśleć o algorytmie Grovera: masz wyrocznię implementującą funkcję logiczną, która wyprowadza dla pojedynczej kombinacji bitów wejściowych, w przeciwnym razie wyprowadza zero, a twoim zadaniem jest znalezienie tej kombinacji. Problem ma tę samą złożoność, co wyszukiwanie na nieposortowanej liście lub bazie danych, dlatego algorytm Grovera jest zwykle opisywany jako wyszukiwanie w nieposortowanej bazie danych. Ale zastosowanie algorytmu do wyszukiwania w rzeczywistej bazie danych rzeczywiście rodzi pytania, które wykraczają poza sam algorytm. Algorytm Grovera szuka tylko tego, co wie wyrocznia.1
źródło
Chociaż być może najłatwiej jest nam pomyśleć o funkcji wyroczni, która już obliczyła wszystkie te wartości, to nie jest to, co robi. W opisanym przypadku wyrocznia ma 8 możliwych danych wejściowych (tj. Zakodowanych w 3 (qu) bitach), a wyrocznia wykonuje wszystkie obliczenia, których potrzebujesz w locie . Tak więc, w momencie, gdy próbujesz oszacować wyrocznię dla pewnej wartości , wyrocznia wyszukuje (w tym przypadku) kartę, że wartość xx x odpowiada, a następnie sprawdza, czy ta karta jest kartą zaznaczoną. Chodzi o to, że za każdym razem, gdy wywołujecie wyrocznię, przechodzi on ten proces raz. Ogólnie rzecz biorąc, oceniasz tę funkcję tyle razy, ile razy wywołujesz wyrocznię. Celem każdego algorytmu wyszukiwania jest wywoływanie tej wyroczni jak najmniej razy.
W przypadku, gdy zabrzmi to trochę okrężnie (biorąc pod uwagę , znajdź, która karta odpowiada), pamiętaj, że twoja tabela wyszukiwania dla tego, co x odpowiada karcie, którą można zamówić, to jest inne, prostsze i znacznie szybsze pytanie wyszukiwania.x x
Kluczowe różnice w twoim przykładzie w porównaniu do bardziej realistycznego scenariusza użytkowania to:
Przestrzeń wyszukiwania jest zwykle ogromna. Nie ma realistycznych perspektyw na wstępne obliczenie wszystkich wartości. Rzeczywiście, właśnie tego staramy się uniknąć.
Zazwyczaj nie mówimy „znajdź asa pik”. Zamiast tego istnieje który nie jest trywialny do oceny w celu sprawdzenia, czy x jest „zaznaczonym” elementem, czy nie. Fakt, że wyrocznia może zająć dość dużo czasu, nawet w przypadku pojedynczego wejścia, sprawia, że wyrocznia jest kosztowną częścią do wdrożenia (a wszystkie inne bramy są wydawane za darmo) i dlaczego musisz zminimalizować liczbę połączeń .f(x) x
Tak więc tak naprawdę klasyczne wyszukiwanie zadziałałoby na twoim problemie: losowo wybierz . Oszacuj y = f ( x ) . Jeśli y = 1 , zwróć x , w przeciwnym razie powtórz. Podczas gdy efektem netto f ( x ) jest „jest wejście x 0 , zaznaczony wpis?”, To nie jest to rzeczywiste obliczenie, które robi.x y=f(x) y=1 x f(x) x0
źródło
Pytanie ostatecznie brzmi: „Jaki sens ma wykonanie algorytmu, jeśli szukaliśmy już elementu, aby zbudować wyrocznię?”
Chociaż ktoś wcześniej zbudował wyrocznię, być może nie była to osoba, która go używa.
Pytamy wyrocznię: jaka jest już odpowiedź na pytanie, które już ma? Nawet Mateus i Omar pytaliby „symbol wyroczni dla konkretnego alfabetu” w czasie wykonywania, jakie są pozycje tego symbolu w ciągu, który już skompilował? Wyrocznia udzieli odpowiedzi na nasze zapytanie już po jednej konsultacji, ale w tej historii nie może na przykład po prostu napisać odpowiedzi jako ciągu binarnego i wysłać do nas klasycznym kanałem komunikacji. Ukryje swoją odpowiedź w superpozycji, abyśmy ją wyciągnęli.
Pozwalam sobie na ucieczkę fantazji lub metafory: za pierwszym razem nie słyszymy odpowiedzi i musimy prosić wyrocznię, aby powtarzała tę samą odpowiedź w kółko, dopóki nie będziemy pewni, co powiedziała wyrocznia: z wyjątkiem tego, że zaczynamy halucynować od dezinformacji w procesie dyfuzji, jeśli pytamy zbyt wiele razy.
źródło
Biorąc pod uwagę wyrocznię, którą podałeś, poszukiwanie jest rzeczywiście bezcelowe. Jednak wyrocznia tęskni za algorytmem Grovera, ponieważ szukanie karty w talii kart nie jest wyszukiwaniem nieustrukturyzowanym, ponieważ, jak już powiedziałeś, znasz kolejność. Ergo, twoje wyszukiwanie jest uporządkowane. Powodem użycia tej wyroczni jest to, że pokazuje, w jaki sposób można zastosować Grovera bez konieczności omawiania wyroczni, która sprawiłaby, że Grover byłby użyteczny, ponieważ taka wyrocznia byłaby bardziej skomplikowana niż cenna. Dlatego lepsza wyrocznia do wykazania przydatności Grovera może być taka:
To wyrocznia implikuje to, że masz 8-kubitowe wyszukiwanie, w którym bierzesz pierwsze cztery kubity i dodajesz je do drugich czterech kubitów i odwracasz M, jeśli suma daje 10 (1010 dwójkowo). Różnica między tą wyrocznią a tą, którą podałeś, polega na tym, że wyrocznia testuje wzór (czy argumenty dodają do 10), podczas gdy twój testuje równość (jest to indeks 5). Wyrocznia ta jest znacznie trudniejsza do zbudowania, ale wykorzystuje prawdziwą moc Grovera, która jest w gruncie rzeczy poszukiwaniami brutalnymi, w których twoja wyrocznia określa przestrzeń poszukiwań.
źródło