Содержание
Понятие поиска
Исчерпывающий поиск
Бинарный поиск
Бинарное дерево поиска
Метод ветвей и границ
Список использованной информации
1. Понятие поиска.
Поиск — обработка некоторого множества данных с целью выявления подмножества данных, соответствующего критериям поиска. Все алгоритмы поиска делятся на:
поиск в неупорядоченном множестве данных;
поиск в упорядоченном множестве данных.
Упорядоченность – наличие отсортированного ключевого поля.
2. Исчерпывающий поиск.
Исчерпывающий поиск (линейный, последовательный) – простейший алгоритм поиска. Массив просматривается последовательно от первого до последнего элемента. Наихудший случай - слова нет в массиве (не найдено) – вывод можно сделать после просмотра всего массива. Достоинство – простота реализации. Недостаток – большое время. Сложность алгоритма О(n).
Алгоритм последовательного поиска:
Шаг1. Полагаем, что значение переменной цикла i=0.
Шаг2. Если значение элемента массива x[i] равно значению ключа key, то возвращаем значение, равное номеру искомого элемента, и алгоритм завершает работу. В противном случае значение переменной цикла увеличивается на единицу i=i+1.
Шаг3. Если i<k, где k-число элементов массива х, то выполняется шаг2, в противном случае – работа алгоритма завершена и возвращается значение равное -1. При наличии в массиве нескольких элементов со значением key алгоритм находит только первый из них (с наименьшим индексом).
#include <iostream>
using namespace std;
typedef int DType;
int SeqSearch(DType *, int, DType);
int main() {
int size, point;
DType key;
cout << "Введите размер массива" << endl;
cin >> size;
DType *k = new DType[size];
cout << "Введите искомый элемент" << endl;
cin >> key;
//заполнение массива через цикл for//
point = SeqSearch(k, size, key);
if (point == -1) // если функция вернула -1, такого элемента в массиве нет
cout << "Элементов равных " << key << " в массиве нет";
else // иначе выводим полученный индекс элемента
cout << "Элемент равный " << key << " имеет индекс " << point;
return 0;
}
int SeqSearch(DType *k, int n, DType key)
{
for (int i = 0; i < n; i++) // просматриваем все элементы в цикле
{
if (k[i] == key) // если находим элемент со значением key,
return i; // возвращаем его индекс
}
return -1; // возвращаем -1 - элемент не найден
}
3. Бинарный поиск.
Алгоритм двоичного поиска используется только в упорядоченных массивах по требуемому свойству.
Так при поиске числа с заданным значением необходимо иметь массив, упорядоченный по возрастанию или по убыванию значений элементов. При бинарном поиске искомый ключ сравнивается с ключом среднего элемента в массиве. Если они равны, то поиск успешен. В противном случае поиск осуществляется аналогично в левой или правой частях массива. Алгоритм может быть определен в рекурсивной и нерекурсивной формах. Бинарный поиск также называют поиском методом деления отрезка пополам или дихотомии.
Количество шагов поиска определится как log2n, где n-количество элементов.На каждом шаге осуществляется поиск середины отрезка по формуле mid = (left - right)/2
Если искомый элемент равен элементу с индексом mid, поиск завершается. В случае если искомый элемент меньше элемента с индексом mid, на место mid перемещается правая граница рассматриваемого отрезка, в противном случае - левая граница.
Перед началом поиска устанавливаем левую и правую границы массива: left и right
Ищем индекс середины массива (округляем в меньшую сторону): mid = (left+right)/2
Если искомый элемент выше середины то сдвигаем нижнюю границу left = mid +1
Если искомый элемент ниже середины то сдвигаем верхнюю границу right = mid -1
Если искомый элемент равен элементу посередине то возвращаем значение.
Повторяем пока не найдем нужный элемент в массиве, либо не выведем сообщение что такого элемента нет.
#include <iostream>
using namespace std;
typedef int DType;
int BinSearch(DType *, int, int, DType);
