Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 16-17 - Теория алгоритмов.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
312.83 Кб
Скачать

Алгоритм бинарного поиска

Пока слово не найдено:

а) Если слово больше слова в середине списка, искать слово в правой половине списка.

б) Если слово меньше слова в середине списка, искать слово в левой половине списка.

в) Если слово совпадает со словом в середине списка, завершить поиск.

На каждом шаге диапазон поиска делится на 2. Если слово найдено, алгоритм останавливается. Какое максимальное количество шагов, которые может понадобиться сделать, чтобы найти слово?

Всего слов N. На каждом шаге от массива длины N мы переходим к списку длиной N/2, потом к списку длиной N/4, списку длиной N/8 и т.д. Такое деление можно производить до тех пор, пока не будет получен список длиной 1, а именно, делить массив длины N пополам можно log2N раз. log2N – число шагов в наихудшем случае, то есть количество шагов, которое потребуется, чтобы гарантированно найти слово в списке. Время работы этого алгоритма приблизительно пропорционально log2N.

Для поиска перебором в наихудшем случае требуется N шагов. Сравним значения N и log2N для разных значений N:

N

5

10

50

100

10000

log2N

2,3

3,3

5,6

6,6

13,3

График зависимости скорости роста числа операций t(n) от количества входных данных n

Чем больше количество входных данных N, тем заметнее проявляется преимущество бинарного поиска благодаря незначительной величине log2N.

Временную сложность алгоритма не требуется определять с высокой точностью. На ее конкретное значение может влиять множество факторов и тонкостей реализации, наша же задача – оценить алгоритм в целом. Некоторыми действиями при этом можно пренебречь, потому что при больших значениях N они будут несущественны. Поэтому в большинстве случаев достаточно определить только асимптотическую сложность.

Оценка асимптотической сложности заключается в нахождении функций простого вида, которые при больших значениях N ведут себя подобно исследуемой сложной функции.

Говорят, что алгоритм относится к классу O(f) (читается: «О большое от f»), если его сложность растет не быстрее функции f. Это означает, что если сложность алгоритма T(N), то при больших N выполняется T(N)  cf(N),где c > 0.

Другими словами, совсем не обязательно определять точное значение сложности T(N), достаточно с помощью ряда стандартных приемов оценить его верхнюю границу f(N), где f(N) выбирается из ограниченного набора удобных для восприятия функций.

Например, алгоритм поиска перебором относится к классу O(N) (говорят: алгоритм поиска перебором выполняется за линейное время). Алгоритм бинарного поиска относится к классу O(log2N) (говорят: алгоритм выполняется за логарифмическое время).

Классы вычислительной сложности (в порядке «возрастания» при больших n):

  • O (1) – постоянное время. Время выполнения алгоритмов этого класса не зависит от количества входных данных.

  • O (log2N) – логарифмическое время. Общая особенность алгоритмов этого класса – многократное разбиение задачи на более мелкие подзадачи.

  • O (N) – линейное время. Алгоритмы этого класса затрачивают одинаковое время на обработку каждого элемента входных данных.

  • O (N log N).

  • O (N2), O(N3) квадратичное и кубическое время. В алгоритмах этого класса перебираются все возможные пары и тройки элементов.

  • O (2N) – экспоненциальное время.

Алгоритмы с меньшей асимптотической сложностью для больших наборов данных являются более эффективными, что иллюстрирует следующий график (чтобы увеличить диапазон отображения, вертикальная ось представлена в логарифмическом масштабе):

Рост вычислительной сложности для различных классов алгоритмов

Задачи, решаемые с помощью алгоритмов, делятся на два класса в зависимости от сложности алгоритмов:

Классы задач:

  1. Класс P (полиномиальной сложности) – задачи, для которых есть алгоритмы решения со сложностью O(Nk), (т.е. O(N), O(N2), O(N3) и т.д.; как правило, k  6). Это практически разрешимые задачи, точное решение для которых можно найти за разумный промежуток времени.

Большинство алгоритмов, которые рассматриваются в учебной литературе, имеют полиномиальную сложность не выше N3.

  1. Класс NP (недетерминированной полиномиальной сложности) – задачи, для которых все известные алгоритмы решения имеют сложность O(2N) или O(N!). Это практически неразрешимые задачи, для решения которых используются приближенные алгоритмы. Рассмотрим, например, задачи со сложностью 2N. Если к набору входных данных добавить один элемент, время работы алгоритма удвоится! Если для обработки 10 элементов алгоритм выполняет 1024 операции, для обработки 11 элементов он будет выполнять уже 2048 операций. Это значительное возрастание времени.

Решение таких задач разбивается на два этапа: вначале генерируется возможное решение задачи (попытка угадать его), а затем выполняется проверка, насколько полученное решение близко к требуемому. Другой подход – заменить практически неразрешимую задачу другой задачей, близкой по смыслу, но уже практически разрешимой, и получить приближенное решение.