Рандомизированный алгоритм — это алгоритм , который использует степень случайности как часть своей логики или процедуры. Алгоритм обычно использует равномерно случайные биты в качестве вспомогательного входа для управления своим поведением в надежде достичь хорошей производительности в «среднем случае» по всем возможным вариантам случайности, определяемым случайными битами; таким образом, либо время выполнения, либо выход (или оба) являются случайными величинами.
Существует различие между алгоритмами, которые используют случайный ввод, так что они всегда завершаются с правильным ответом, но где ожидаемое время выполнения конечно ( алгоритмы Лас-Вегаса , например, быстрая сортировка [1] ), и алгоритмами, которые имеют вероятность выдать неправильный результат ( алгоритмы Монте-Карло , например, алгоритм Монте-Карло для задачи MFAS [2] ) или не выдать результат, либо сигнализируя об ошибке, либо не завершаясь. В некоторых случаях вероятностные алгоритмы являются единственным практическим средством решения проблемы. [3]
В обычной практике рандомизированные алгоритмы аппроксимируются с использованием генератора псевдослучайных чисел вместо истинного источника случайных битов; такая реализация может отклоняться от ожидаемого теоретического поведения и математических гарантий, которые могут зависеть от существования идеального истинного генератора случайных чисел.
В качестве мотивирующего примера рассмотрим задачу поиска буквы « a » в массиве из n элементов.
Входные данные : массив из n ≥2 элементов, в котором половина — это « a », а другая половина — это « b ».
Вывод : найти « a » в массиве.
Мы приводим две версии алгоритма: алгоритм Лас-Вегаса и алгоритм Монте-Карло .
Алгоритм Лас-Вегаса:
findA_LV ( array A , n ) begin repeat Случайным образом выбрать один элемент из n элементов . пока не будет найден 'a' end
Этот алгоритм успешен с вероятностью 1. Количество итераций варьируется и может быть произвольно большим, но ожидаемое количество итераций равно
Поскольку это константа, ожидаемое время выполнения для многих вызовов составляет . (См. нотацию Big Theta )
Алгоритм Монте-Карло:
findA_MC ( array A , n , k ) begin i := 0 repeat Случайным образом выбрать один элемент из n элементов . i := i + 1 пока не будет найдено i = k или 'a' end
Если найдено ' a ', алгоритм успешен, в противном случае алгоритм терпит неудачу. После k итераций вероятность нахождения ' a ' равна:
Этот алгоритм не гарантирует успеха, но время выполнения ограничено. Количество итераций всегда меньше или равно k. Принимая k за константу, время выполнения (ожидаемое и абсолютное) равно .
Рандомизированные алгоритмы особенно полезны, когда сталкиваются со злонамеренным «противником» или злоумышленником , который намеренно пытается подать в алгоритм неверные входные данные (см. сложность в худшем случае и конкурентный анализ (онлайн-алгоритм) ), например, в дилемме заключенного . Именно по этой причине случайность повсеместно распространена в криптографии . В криптографических приложениях псевдослучайные числа использоваться не могут, поскольку противник может их предсказать, что делает алгоритм фактически детерминированным. Поэтому требуется либо источник действительно случайных чисел, либо криптографически безопасный генератор псевдослучайных чисел . Другая область, в которой случайность присуща, — это квантовые вычисления .
В приведенном выше примере алгоритм Лас-Вегаса всегда выдает правильный ответ, но время его выполнения является случайной величиной. Алгоритм Монте-Карло (связанный с методом Монте-Карло для моделирования) гарантированно завершается за время, которое может быть ограничено функцией размера входных данных и ее параметром k , но допускает небольшую вероятность ошибки . Обратите внимание, что любой алгоритм Лас-Вегаса можно преобразовать в алгоритм Монте-Карло (с помощью неравенства Маркова ), заставив его выводить произвольный, возможно, неверный ответ, если он не завершится в течение указанного времени. И наоборот, если существует эффективная процедура проверки для проверки правильности ответа, то алгоритм Монте-Карло можно преобразовать в алгоритм Лас-Вегаса, многократно запуская алгоритм Монте-Карло до тех пор, пока не будет получен правильный ответ.
Теория вычислительной сложности моделирует рандомизированные алгоритмы как вероятностные машины Тьюринга . Рассматриваются как алгоритмы Лас-Вегаса , так и алгоритмы Монте-Карло , и изучается несколько классов сложности . Самый базовый класс рандомизированной сложности — RP , который является классом задач принятия решений , для которых существует эффективный (полиномиальное время) рандомизированный алгоритм (или вероятностная машина Тьюринга), который распознает экземпляры НЕТ с абсолютной уверенностью и распознает экземпляры ДА с вероятностью не менее 1/2. Дополнительным классом для RP является co-RP. Классы задач, имеющие (возможно, незавершающиеся) алгоритмы со средним временем выполнения случая полиномиальным временем, вывод которых всегда верен, называются классами ZPP .
Класс задач, для которых допускается идентификация как ДА, так и НЕТ-экземпляров с некоторой ошибкой, называется BPP . Этот класс действует как рандомизированный эквивалент P , т.е. BPP представляет собой класс эффективных рандомизированных алгоритмов.
Быстрая сортировка была открыта Тони Хоаром в 1959 году и впоследствии опубликована в 1961 году. [4] В том же году Хоар опубликовал алгоритм quickselect , [5] который находит медианный элемент списка за линейное ожидаемое время. До 1973 года оставался открытым вопрос о существовании детерминированного алгоритма с линейным временем. [6]
В 1917 году Генри Кэбурн Поклингтон представил рандомизированный алгоритм, известный как алгоритм Поклингтона, для эффективного нахождения квадратных корней по модулю простых чисел. [7] В 1970 году Элвин Берлекамп представил рандомизированный алгоритм для эффективного вычисления корней многочлена над конечным полем. [8] В 1977 году Роберт М. Соловей и Фолькер Штрассен открыли рандомизированный тест на простоту за полиномиальное время (т. е. определение простоты числа). Вскоре после этого Майкл О. Рабин продемонстрировал, что тест на простоту Миллера 1976 года также можно превратить в рандомизированный алгоритм за полиномиальное время. В то время не было известно ни одного доказуемо детерминированного алгоритма для проверки простоты за полиномиальное время .
Одной из самых ранних рандомизированных структур данных является хэш-таблица , которая была представлена в 1953 году Гансом Петером Луном в IBM . [9] Хэш-таблица Луна использовала цепочку для разрешения коллизий и также была одним из первых применений связанных списков . [9] Впоследствии, в 1954 году, Джин Амдал , Элейн М. Макгроу , Натаниэль Рочестер и Артур Сэмюэл из IBM Research представили линейное зондирование , [9] хотя Андрей Ершов независимо высказал ту же идею в 1957 году. [9] В 1962 году Дональд Кнут выполнил первый правильный анализ линейного зондирования, [9] хотя меморандум, содержащий его анализ, был опубликован гораздо позже. [10] Первый опубликованный анализ был предоставлен Конхеймом и Вайсом в 1966 году. [11]
Ранние работы по хеш-таблицам либо предполагали доступ к полностью случайной хеш-функции, либо предполагали, что сами ключи являются случайными. [9] В 1979 году Картер и Вегман представили универсальные хеш-функции , [12] которые, как они показали, можно использовать для реализации цепочечных хеш-таблиц с постоянным ожидаемым временем на операцию.
Ранние работы по рандомизированным структурам данных также вышли за рамки хэш-таблиц. В 1970 году Бертон Говард Блум представил структуру данных с приблизительным членством, известную как фильтр Блума . [13] В 1989 году Раймунд Зайдель и Сесилия Р. Арагон представили рандомизированное сбалансированное дерево поиска, известное как treap . [14] В том же году Уильям Пью представил еще одно рандомизированное дерево поиска, известное как skip list . [15]
До популяризации рандомизированных алгоритмов в информатике Пол Эрдёш популяризировал использование рандомизированных конструкций в качестве математического метода для установления существования математических объектов. Этот метод стал известен как вероятностный метод . [16] Эрдёш впервые применил вероятностный метод в 1947 году, когда он использовал простую рандомизированную конструкцию для установления существования графов Рамсея. [17] Он прославился тем, что использовал гораздо более сложный рандомизированный алгоритм в 1959 году для установления существования графов с высоким обхватом и хроматическим числом. [18] [16]
Быстрая сортировка — это знакомый, часто используемый алгоритм, в котором случайность может быть полезна. Многие детерминированные версии этого алгоритма требуют O ( n 2 ) времени для сортировки n чисел для некоторого четко определенного класса вырожденных входов (например, уже отсортированного массива), при этом конкретный класс входов, который генерирует это поведение, определяется протоколом для выбора опорных элементов. Однако, если алгоритм выбирает опорные элементы равномерно случайным образом, он имеет доказуемо высокую вероятность завершения за время O ( n log n ) независимо от характеристик входных данных.
В вычислительной геометрии стандартный метод построения структуры, такой как выпуклая оболочка или триангуляция Делоне, заключается в случайной перестановке входных точек и последующей вставке их по одной в существующую структуру. Рандомизация гарантирует, что ожидаемое количество изменений в структуре, вызванных вставкой, мало, и поэтому ожидаемое время выполнения алгоритма может быть ограничено сверху. Этот метод известен как рандомизированное инкрементное построение. [19]
Вход : Граф G ( V , E )
Выход : Разрез , разделяющий вершины на L и R , с минимальным числом ребер между L и R.
Напомним, что стягивание двух узлов, u и v , в (мульти)графе дает новый узел u ' с ребрами, которые являются объединением ребер, инцидентных либо u , либо v , за исключением любого ребра(ей), соединяющих u и v . На рисунке 1 приведен пример стягивания вершины A и B . После стягивания результирующий граф может иметь параллельные ребра, но не содержит петель.
Базовый алгоритм Каргера [20] :
начинать я = 1 повторить повторить Возьмем случайное ребро (u,v) ∈ E в G замените u и v сокращением u' пока не останется только 2 узла получить соответствующий результат разреза C i я = я + 1 пока я = м вывести минимальный разрез среди C 1 , C 2 , ..., C m . конец
При каждом выполнении внешнего цикла алгоритм повторяет внутренний цикл до тех пор, пока не останется только 2 узла, получается соответствующий разрез. Время выполнения одного выполнения равно , а n обозначает количество вершин. После m выполнений внешнего цикла мы выводим минимальный разрез среди всех результатов. На рисунке 2 показан пример одного выполнения алгоритма. После выполнения мы получаем разрез размером 3.
Лемма 1 — Пусть k будет минимальным размером разреза, и пусть C = { e 1 , e 2 , ..., e k } будет минимальным разрезом. Если во время итерации i ни одно ребро e ∈ C не выбрано для сжатия, то C i = C .
Если G не связен, то G можно разбить на L и R без какого-либо ребра между ними. Таким образом, минимальный разрез в несвязном графе равен 0. Теперь предположим, что G связен. Пусть V = L ∪ R — разбиение V , индуцированное C : C = { { u , v } ∈ E : u ∈ L , v ∈ R } (хорошо определенное, поскольку G связен). Рассмотрим ребро { u , v } графа C . Изначально u , v являются различными вершинами. Пока мы выбираем ребро , u и v не объединяются. Таким образом, в конце алгоритма у нас есть два составных узла, покрывающих весь граф, один из которых состоит из вершин L , а другой — из вершин R . Как и на рисунке 2, размер минимального разреза равен 1, а C = {( A , B )}. Если мы не выберем ( A , B ) для сжатия, мы можем получить минимальный разрез.
Лемма 2 — Если G — мультиграф с p вершинами и минимальный разрез которого имеет размер k , то G имеет по крайней мере pk /2 ребер.
Поскольку минимальный разрез равен k , каждая вершина v должна удовлетворять degree( v ) ≥ k . Следовательно, сумма степеней не менее pk . Но хорошо известно, что сумма степеней вершин равна 2| E |. Лемма следует.
Вероятность того, что алгоритм сработает, равна 1 − вероятность того, что все попытки потерпят неудачу. По независимости вероятность того, что все попытки потерпят неудачу, равна
По лемме 1 вероятность того, что C i = C, является вероятностью того, что ни одно ребро C не будет выбрано во время итерации i . Рассмотрим внутренний цикл и пусть G j обозначает граф после j стягиваний ребер, где j ∈ {0, 1, …, n − 3} . G j имеет n − j вершин. Мы используем цепное правило условных возможностей . Вероятность того, что ребро, выбранное на итерации j, не находится в C , учитывая, что ни одно ребро C не было выбрано ранее, равна . Обратите внимание, что G j по-прежнему имеет минимальный разрез размера k , поэтому по лемме 2 он по-прежнему имеет не менее ребер.
Таким образом, .
Таким образом, по правилу цепочки вероятность нахождения минимального разреза C равна
Отмена дает . Таким образом, вероятность того, что алгоритм сработает, составляет не менее . Для , это эквивалентно . Алгоритм находит минимальный разрез с вероятностью , за время .
Случайность можно рассматривать как ресурс, как пространство и время. Тогда дерандомизация — это процесс удаления случайности (или использования ее как можно меньшего количества). В настоящее время неизвестно [ по состоянию на? ] , все ли алгоритмы могут быть дерандомизированы без значительного увеличения времени их выполнения. Например, в вычислительной сложности неизвестно, P = BPP , т. е. мы не знаем, можем ли мы взять произвольный рандомизированный алгоритм, который работает за полиномиальное время с малой вероятностью ошибки, и дерандомизировать его для работы за полиномиальное время без использования случайности.
Существуют специальные методы, которые можно использовать для дерандомизации определенных рандомизированных алгоритмов:
Когда модель вычислений ограничивается машинами Тьюринга , в настоящее время остается открытым вопрос о том, позволяет ли способность делать случайный выбор решать некоторые задачи за полиномиальное время, которые не могут быть решены за полиномиальное время без этой способности; это вопрос о том, P = BPP. Однако в других контекстах существуют конкретные примеры задач, где рандомизация дает строгие улучшения.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )