Перейти до основного вмісту

Неструктурований пошук

Зміст

Розпочнемо з опису задачі, яку розв'язує алгоритм Ґровера. Як завжди, позначимо двійковий алфавіт Σ={0,1}\Sigma = \{0,1\} протягом усього обговорення.

Нехай

f:ΣnΣf:\Sigma^n \rightarrow \Sigma

— функція з двійкових рядків довжини nn до бітів. Припустимо, що ми можемо ефективно обчислити цю функцію, але в іншому вона довільна і ми не можемо розраховувати на те, що вона має особливу структуру або конкретну реалізацію, яка нам підходить.

Алгоритм Ґровера виконує пошук рядка xΣnx\in\Sigma^n, для якого f(x)=1f(x) = 1. Такі рядки ми називатимемо розв'язками задачі пошуку. Якщо розв'язків кілька, будь-який із них вважається правильною відповіддю; якщо розв'язків немає, правильна відповідь — повідомити про їхню відсутність.

Ця задача називається неструктурованим пошуком, оскільки ми не можемо покладатися на те, що ff має будь-яку конкретну структуру, яка спрощує пошук. Ми шукаємо не в упорядкованому списку й не в якійсь структурі даних, спеціально призначеній для пошуку, — ми буквально шукаємо голку в копиці сіна.

Інтуїтивно можна уявити собі надзвичайно складну булеву схему, яка обчислює ff, і ми можемо легко запустити цю схему на вибраному вхідному рядку. Але оскільки схема настільки складна, нам не вдасться розібратися в ній простим розглядом (окрім здатності обчислювати її значення на вибраних вхідних рядках).

Один класичний спосіб виконати це завдання пошуку — просто перебрати всі рядки xΣnx\in\Sigma^n, обчислюючи ff для кожного, щоб перевірити, чи є він розв'язком. Позначимо далі

N=2nN = 2^n

для зручності. У Σn\Sigma^n є NN рядків, тому їх перебір вимагає NN обчислень ff. Якщо ми обмежені обчисленням ff на обраних вхідних даних і хочемо гарантовано знайти відповідь, це найкраще, що можна зробити детермінованим алгоритмом. При ймовірнісному підході можна спробувати заощадити час, випадково обираючи вхідні рядки для ff, але все одно знадобиться O(N)O(N) обчислень ff для високої ймовірності успіху.

Алгоритм Ґровера розв'язує цю задачу пошуку з високою ймовірністю, виконуючи лише O(N)O(\sqrt{N}) обчислень ff. Уточнимо: ці обчислення функції відбуваються у суперпозиції, аналогічно до алгоритмів із запитами з уроку «Квантові алгоритми з запитами», включаючи алгоритм Дойча, алгоритм Дойча–Йожі та алгоритм Саймона. На відміну від них, алгоритм Ґровера є ітеративним: він обчислює ff на суперпозиціях вхідних рядків і чергує ці обчислення з іншими операціями, що створюють інтерференційні картини, приводячи до розв'язку з високою ймовірністю (якщо він існує) після O(N)O(\sqrt{N}) ітерацій.

Формальна постановка задачі

Формалізуємо задачу, яку розв'язує алгоритм Ґровера, у моделі обчислень із запитами. Тобто припустимо, що ми маємо доступ до функції f:ΣnΣf:\Sigma^n\rightarrow\Sigma через гейт запиту, визначений звичайним чином:

Uf(ax)=af(x)xU_f \bigl( \vert a\rangle \vert x\rangle \bigr) = \vert a \oplus f(x) \rangle \vert x \rangle

для кожного xΣnx\in\Sigma^n та aΣa\in\Sigma. Це дія UfU_f на базисних станах, а її дія в загальному випадку визначається лінійністю.

Як обговорювалося в уроці «Основи квантових алгоритмів», маючи булеву схему для обчислення ff, її можна перетворити на квантову схему, що реалізує UfU_f (використовуючи певну кількість додаткових кубітів, що починають і закінчують обчислення у стані 0\vert 0\rangle). Таким чином, хоча ми використовуємо модель запитів для формалізації задачі, яку розв'язує алгоритм Ґровера, він не обмежений цією моделлю: алгоритм Ґровера можна запускати для будь-якої функції ff, для якої є булева схема.

Ось точне формулювання задачі, яка називається Пошук, оскільки ми шукаємо розв'язок — рядок xx, для якого ff набуває значення 11.

Пошук

Вхід: функція f:ΣnΣf:\Sigma^n\rightarrow\Sigma
Вихід: рядок xΣnx\in\Sigma^n, що задовольняє f(x)=1f(x) = 1, або «розв'язок відсутній», якщо такого рядка xx не існує

Зауважимо, що це не задача з обіцянкою — функція ff є довільною. Проте корисно розглянути таку варіацію з обіцянкою, де гарантовано існує рівно один розв'язок. Ця задача наводилася як приклад задачі з обіцянкою в уроці «Квантові алгоритми з запитами».

Унікальний пошук

Вхід: функція вигляду f:ΣnΣf:\Sigma^n \rightarrow \Sigma
Обіцянка: існує рівно один рядок zΣnz\in\Sigma^n, для якого f(z)=1f(z) = 1, і f(x)=0f(x) = 0 для всіх рядків xzx\neq z
Вихід: рядок zz

Також зауважимо, що задача Або, згадана в тому ж уроці, тісно пов'язана із задачею Пошук. У тій задачі мета — лише визначити, чи існує розв'язок, а не знайти його.