11.07.2015 Views

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

Выпуск 1 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

метьте, что при малых значениях n все может бытьнаоборот, это зависит от постоянной c для каждогоиз алгоритмов.Известны и алгоритмы, для которых количествоопераций растет быстрее, чем любой полином,например, как O(2 n ) или O(n!). Они встречаютсячаще всего в задачах оптимизации, которыерешаются только методом полного перебора. Самаяизвестная задача такого типа — это задачакоммивояжера (бродячего торговца), которыйдолжен посетить по одному разу каждый из указанныхгородов и вернуться в начальную точку.Для него нужно выбрать оптимальный маршрут,при котором стоимость поездки (или общая длинапути) будет минимальной.Еще один пример сложной задачи, которая решаетсятолько полным перебором всех вариантов —задача выполнимости. Дано логическое выражение,которое содержит только имена логическихпеременных, скобки, а также операции “И”, “ИЛИ”и “НЕ”. Требуется определить, существует ли наборзначений логических переменных, при котором заданноевыражение истинно.Алгоритмы поискаРис. 16Сравним вычислительную сложность двух наиболееизвестных алгоритмов поиска.Пример 4 (линейный поиск). Дан массив, вкотором элементы расположены в произвольномпорядке. Найти в нем заданное значение x или сообщить,что его нет.Решение этой задачи сводится к последовательномупросмотру всех элементов массива:nX:= 0нц для i от 1 до nесли A[i] = X тоnX:= iвыходвсекцесли nX > 0 товывод "A[", nX, "]=", Xиначевывод "Элемент не найден"всеВ этом алгоритме число сравнений (в худшемслучае) равно T(n) = n, поэтому он имеет линейнуюсложность.Пример 5 (двоичный поиск). Дан массив, вкотором элементы упорядочены по возрастанию.Найти в нем заданное значение x или сообщить,что его нет.В сравнении с предыдущей задачей элементымассива отсортированы, и это ускоряет решение,потому что можно применить метод двоичного поиска(дихотомии):L:= 1; R:= n + 1нц пока L + 1 < Rc:= div(L + R, 2) |или c:= L + div(R - L,2)если X < A[c] тоR:= cиначеL:= cвсекцесли A[L] = X товывод "A[", L, "]=", Xиначевывод "Элемент не найден"всеПопробуем определить, сколько раз выполняетсяосновной цикл при двоичном поиске. Сначалаширина интервала поиска — все n элементовмассива. На каждом шаге этот интервал делитсяна 2, процесс завершается, когда левая и праваяграницы интервала совпадут. Предположим, чточисло элементов — это целая степень двойки, тоесть n = 2 m . Тогда за m шагов ширина интерваласужается до 1, а на следующем шаге его границысовпадут и цикл закончится. Таким образом, количествошагов цикла равно m + 1. Из равенстваn = 2 m получаем m = log 2n, так чтоT(n) = log 2n + 1.Например, при n = 2 16 линейный поиск потребуетв худшем случае 2 16 = 65 536 сравнений, а двоичный— всего 16 + 1 = 17 сравнений.Таким образом, алгоритм двоичного поискаимеет асимптотическую сложность O(logn). Основаниелогарифма обычно не указывают, потому чтовыражения log an и log bn отличаются на постоянныймножитель (который можно включить в постояннуюc):1logan = ⋅ logbn.log aМожно ли сказать, что алгоритм двоичного поискалучше алгоритма линейного поиска? Нет!Ведь алгоритм линейного поиска применим клюбым массивам данных, а алгоритм двоичногопоиска — только к упорядоченным (отсортированным).А если мы сначала отсортируем массив,а потом применим к нему двоичный поиск, тообщее время работы будет больше, чем при линейномпоиске.b15январь 2012 / ИНФорматика

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!