Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты по проге.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
630.61 Кб
Скачать
  1. Метод барьера в линейном поиске

Если нет дополнительной информации о данных, то используется простой последовательный просмотр массива .

Условие окончания поиска:

  1. Элемент найден, а[i]=x;

  2. Весь массив просмотрен и нет совпадения.

Линейный поиск имеет сложность О(n). В связи с малой эффективностью по сравнению с другими алгоритмами линейный поиск обычно используют только если отрезок поиска содержит очень мало элементов, тем не менее линейный поиск не требует дополнительной памяти или обработки/анализа функции, так что может работать в потоковом режиме при непосредственном получении данных из любого источника. Так же, линейный поиск часто используется в виде линейных алгоритмов поиска максимума/минимума.

Метод фиктивного элемента (метод барьера) в линейном поиске – метод, позволяющий сократить количество сравнений за счет расположения в конце массива искомого элемента:

Следует обратить внимание, что если элемент найден, то он найден вместе с минимально возможным индексом, т. е. это первый из таких элементов. Равенство i=N свидетельствует, что совпадения не существует. Очевидно, что окончание цикла гарантировано, поскольку на каждом шаге значение i увеличивается, и, следовательно, оно достигнет за конечное число шагов предела N; фактически же, если совпадения не было, это произойдет после N шагов. На каждом шаге алгоритма осуществляется увеличение индекса и вычисление логического выражения. Можно упростить шаг алгоритма, если упростить логическое выражение, которое состоит из двух членов. Это упрощение осуществляется путем формулирования логического выражения из одного члена, но при этом необходимо гарантировать, что совпадение произойдет всегда. Для этого достаточно в конец массива поместить дополнительный элемент со значением x. Такой вспомогательный элемент называется барьером. Нельзя применять, когда передаётся массив фиксированной длины. Без барьера:

int A[N]; int x,i=0;

while (i<N&&A[i]!=x) i++;

if (i<N) элемент найден

else элемента в массиве нет

Поиск прекращается, если : элемент найден, т.е. A[i]=x, или просмотрен массив и элемент не найден. На каждом шаге приходится проверять условие и сдвигать счётчик на 1. Можно упростить, упростив условие цикла. Для этого нужно составить одно условие, из которого будут вытекать оба. В данном поиске это возможно если элемент Х будет гарантированно найден в массиве А. Это можно обеспечить, поместив Х в последний дополнительный элемент массива. Такой элемент называется барьером, т.к. он предотвращает выход поиска за границы массива. Из i=N следует, что искомого значения нет, кроме барьера.

С барьером:

int A[N+1]; int x, i=0; A[N]=x;

while (A[i]!=x) i++:

if (i<N) элемент найден

else элемента в массиве нет

Бинарный поиск

Массив отсортирован.

Идея поиска заключается в том, чтобы брать элемент посередине, между границами, и сравнивать его с искомым. Если искомое больше(в случае правостороннего — не меньше), чем элемент сравнения, то сужаем область поиска так, чтобы новая левая граница была равна индексу середины предыдущей области. В противном случае присваиваем это значение правой границе. Проделываем эту процедуру до тех пор, пока правая граница больше левой более чем на  . В случае правостороннего бинарного поиска ответом будет индекс  , а в случае левостороннего —  .

int binsearch(int x, int v[], int n)

{

   int low, high, mid;

   low = 0;

   high = n - 1;

   while (low <= high) {

       mid = (low+high)/2;

       if (x < v[mid])

           high = mid + 1;

       else if (x  > v[mid])

           low = mid + 1;

       else    /* found match */

           return mid;

   }

   return -1;   /* no match */

1). Если сумма указателей не помещается в тип

2). Вернёт -1 при н=0

Правосторонний бинарный поиск (англ. rightside binary search) — бинарный поиск, с помощью которого мы ищем  , где   — массив, а   — искомый ключ

Определение:

Левосторонний бинарный поиск (англ. leftside binary search) — бинарный поиск, с помощью которого мы ищем  , где   — массив, а   — искомый ключ

Использовав эти два вида двоичного поиска, мы можем найти отрезок позиций   таких, что   и 

Например:

Задан отсортированный массив  .

Правосторонний поиск двойки выдаст в результате  , в то время как левосторонний выдаст   (нумерация с единицы).

От сюда следует, что количество подряд идущих двоек равно длине отрезка  , то есть  .

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

Анализ

Каждый раз делим массив пополам, тогда деление K раз равно n/2^k =1, k = log(2)n, что лучше, чем N.