Вибір кількості ітерацій
Ми встановили, що вектор стану регістра в алгоритмі Гровера залишається у двовимірному підпросторі, натягнутому на і після виконання кроку ініціалізації.
Мета — знайти елемент і ця мета буде досягнута, якщо вдасться отримати стан оскільки при вимірюванні цього стану ми гарантовано отримаємо результат Враховуючи, що стан після ітерацій на кроці 2 дорівнює
слід обрати таким чином, щоб
було якомога ближчим до за модулем, максимізуючи ймовірність отримати при вимірюванні. Для будь-якого кута значення коливається зі збільшенням хоча й не обов'язково є періодичним — немає гарантії, що ми коли-небудь отримаємо одне й те саме значення двічі.
Звичайно, окрім того, щоб зробити ймовірність отримання елемента при вимірюванні великою, ми також хочемо обрати якомога меншим, оскільки застосувань операції вимагають запитів до функції Оскільки ми прагнемо зробити близьким до за модулем, природний спосіб — обрати так, щоб
Розв'язуючи відносно отримуємо
Звичайно, повинно бути цілим числом, тому ми не завжди можемо точно влучити в це значення — але можемо взяти найближче ціле число до цього значення, а саме
Це рекомендована кількість ітерацій для алгоритму Гровера. Продовжуючи аналіз, ми побачимо, що близькість цього цілого числа до цільового значення природним чином впливає на продуктивність алгоритму.
(Зауважимо до речі, що якщо цільове значення виявляється рівно посередині між двома цілими числами, цей вираз для відповідає округленню вгору. Можна також округлити вниз, що має сенс, оскільки означає на один запит менше — але це другорядне і несуттєве для цілей уроку.)
Згадуючи, що значення кута задається формулою
бачимо, що рекомендована кількість ітерацій залежить від кількості рядків у Це становить проблему, якщо ми не знаємо кількість розв'язків, як ми обговоримо пізніше.
Унікальний пошук
Спочатку зосередимось на ситуації, коли існує єдиний рядок такий, що Інший спосіб сказати це — ми розглядаємо екземпляр задачі унікального пошуку. У цьому випадку маємо
що зручно апроксимується як
при великих Підставляючи у вираз
отримуємо
Згадуючи, що — це не лише кількість разів, коли виконується операція але й кількість запитів до функції необхідних алгоритму, бачимо, що ми на шляху до отримання алг оритму, що вимагає запитів.
Тепер дослідимо, наскільки добре працює рекомендований вибір Ймовірність того, що фінальне вимірювання дасть єдиний розв'язок, можна явно виразити як
Перший аргумент, відповідає кількості елементів, серед яких виконується пошук, а другий аргумент, у цьому випадку, — кількості розв'язків. Дещо пізніше ми використаємо те саме позначення в більш загальному вигляді, де існує кілька розв'язків.
Ось таблиця ймовірностей успіху для зростаючих значень
Зауважимо, що ці ймовірності не є строго зростаючими. Зокрема, є цікава аномалія при де розв'язок отримується з повною визначеністю. Проте можна довести у загальному випадку, що
для всіх тож ймовірність успіху прямує до в границі при що й видно з наведених значень. Це добре!
Проте зауважимо, що навіть слабка оцінка підтверджує корисність алгоритму Гровера. Для будь-якого результату вимірювання отриманого від запуску процедури, ми завжди можемо перевірити, чи за допомогою одного запиту до І якщо ймовірність не отримати єдиний рядок для якого при одному запуску процедури не перевищує то після незалежних запусків ймовірність не отримати цей рядок не перевищує Тобто, використовуючи запитів до ми знайдемо єдиний розв'язок з ймовірністю принаймні Використовуючи кращу оцінку можна показати, що ймовірність знайти цим методом насправді становить принаймні
Кілька розв'язків
Зі зміною кількості елементів у змінюється і кут що може суттєво впливати на ймовірність успіху алгоритму. Для стислості позначимо кількість розв'язків, і, як раніше, припустимо
Як мотивуючий приклад, уявімо, що маємо розв'язки замість одного, як розглядалось вище. Це означає, що
що приблизно вдвічі більший за кут у випадку при велик их Припустимо, що ми не знали нічого кращого і обрали те саме значення що й у випадку єдиного розв'язку:
Наслідки будуть катастрофічними, як показує така таблиця ймовірностей.
Цього разу ймовірність успіху прямує до при Це відбуваєтьс я тому, що ми ефективно обертаємось удвічі швидше, ніж при єдиному розв'язку, тому проскакуємо мимо цільового стану і опиняємось поблизу
Проте якщо замість цього використовувати рекомендований вибір а саме
для
то продуктивність буде кращою. Точніше, цей вибір забезпечує успіх з високою ймовірністю.
Узагальнюючи сказане раніше, можна довести, що
де використовуємо позначення, запропоноване раніше: означає ймовірність того, що алгоритм Гровера, запущений на ітерацій, виявить розв'язок, коли є розв'язків з можливостей.
Ця нижня оцінка дещо дивна тим, що більша кількість розв'язків означає гіршу нижню оцінку — але за умови, що значно менше за ми все одно робимо висновок, що ймовірність успіху є достатньо великою. Як і раніше, сам факт, що є достатньо великою, підтверджує корисність алгоритму.
Також виявляється, що
Ця нижня оцінка описує ймовірність того, що рядок обраний рівномірно випадково, є розв'язком — тобто алгоритм Гровера завжди діє принаймні так само добре, як випадкове вгадування. (Насправді, при алгоритм Гровера і є випадковим вгадуванням.)
Тепер розглянемо кількість ітерацій (а отже, і кількість запитів)
для
Для кожного маємо тому
Це означає, що
Це відповідає економії запитів зі зростанням Зокрема, необхідна кількість запитів становить
Невідома кількість розв'язків
Якщо кількість розв'язків невідома, потрібен інший підхід, оскільки в цій ситуації у нас немає знань про для вибору Насправді, існує кілька підходів.
Один простий підхід — обрати
рівномірно випадково. Такий вибір завжди знаходить розв'язок (якщо він існує) з ймовірністю більше 40%, хоча це не очевидно і вимагає аналізу, який тут не наводиться. Проте це має сенс, особливо якщо думати про геометричну картинку: обертання стану випадкову кількість разів схоже на вибір випадкового одиничного вектора в просторі, натягнутому на і для якого ймовірно, що коефіцієнт при буде достатньо великим. Повторюючи цю процедуру і перевіряючи результат так само, як описано раніше, ймовірність знайти розв'язок можна зробити дуже близькою до
Існує уточнений метод, що знаходить розв'язок (коли він існує) з використанням запитів навіть тоді, коли кількість розв'язків невідома, і вимагає запитів для встановлення того, що розв'язків немає, при
Основна ідея — обирати рівномірно випадково з множини ітеративно, збільшуючи значення Зокрема, можна почати з і збільшувати його експоненційно, завжди завершуючи процес, щойно знайдено розв'язок, і обмежуючи щоб не витрачати запити дарма, якщо розв'язку немає. Процес використовує той факт, що при більшій кількості розв'язків потрібно менше запитів. Проте слід дотримуватись певної обережності, щоб збалансувати швидкість зростання з ймовірністю успіху на кожній ітерації. (Наприклад, спрацьовує, як показує аналіз. Проте подвоєння не спрацьовує — це виявляється занадто швидким зростанням.)
Тривіальні випадки
У проведеному вище аналізі ми припускали, що кількість розв'язків ненульова. Дійсно, посилаючись на вектори
ми неявно припускали, що і обидві непорожні. Тут ми коротко розглянемо, що відбувається, коли одна з цих множин порожня.
Перш ніж вдаватися в аналіз, зазначимо очевидне: якщо кожний рядок є розв'язком, то при вимірюванні ми побачимо розв'язок; а коли розв'язків немає, ми його не побачимо. У певному сенсі глибший аналіз тут не потрібен.
Проте можемо швидко перевірити математику для цих тривіальних випадків. Ситуація, коли одна з множин або порожня, виникає, коли є константною: порожня, якщо для кожного і порожня, якщо для кожного Це означає, що
і тому
Отже, незалежно від кількості ітерацій виконаних у цих випадках, вимірювання завжди виявлятиме рівномірно випадковий рядок