
Лекция 7. Поиск в массиве.
Задача поиска элемента в последовательности
Линейный поиск.
Бинарный поиск
Асинхронный поиск.
Методы обработки последовательности однотипных элементов зависят от формы представления последовательности в памяти компьютера. Последовательность может быть реализована, например, в виде одномерного массива, списка, строки (если это последовательность символов), файла. Начнем изучение методов поиска и сортировки одномерных массивов.
1. Поиск элемента в массиве
Задача поиска элемента в последовательности - одна из важных задач программирования как с теоретической, так и практической точек зрения. Вот ее формулировка:
Пусть A = {a1, a2, ...} - последовательность однотипных элементов и b - некоторый элемент, обладающий свойством P. Требуется найти место элемента b в последовательности А. Поскольку представление последовательности в памяти может быть осуществлено в виде массива, задачи могут быть уточнены как задачи поиска элемента в массиве A. Как мы видим, и конкретная постановка задачи, и, следовательно, алгоритм ее решения зависит от рассматриваемого свойства Р. Например:
1. Найти максимальный элемент массива;
2. Найти данный элемент массива;
3. Найти k-тый по величине элемент массива;
Наиболее простые и часто оптимальные алгоритмы основаны на последовательном просмотре массива A с проверкой свойства P на каждом элементе. Этот метод называют линейным просмотром (поиском).
2. Линейный поиск в массиве
Пример 1. Поиск минимального элемента в массиве.
Рrogram MinItem;
Const n = 100;
Type Mas= Array [1..n] of Real;
Var A : Mas;
Min, Item : Real; i : Integer;
Begin
{Блок ввода массива}
Min := A[1];
For i := 2 to n do
If Min > A[i] then Min := A[i]
{Вывод значения Min}
End.
Переменная Item введена для того, чтобы избежать повторных вычислений индексного выражения в A[i].
Рrogram MinItem;
Const n = 100;
Var A : Array [1..n] of Real;
Min, Item : Real; Index, i : Integer;
Begin
{Блок ввода массива}
Index := 1; Min := A[1];
For i := 2 to n do
begin
Item := A[i];
If Min > Item then
begin
Index := i;
Min := Item
end
end;
{Вывод значения Index}
End.
Еще раз обращаем внимание на то, что основной задачей поиска является определение места элемента в последовательности, а не его значение.
Для наглядного представления массива часто полезно изображать его в системе координат Индекс – Величина элемента.
Рис 1. Поиск минимального элемента в массиве методом линейного просмотра.
Min – текущее значение искомого элемента. Index – его номер в массиве.
Перед первым шагом просмотра Min = A[1], а Index = 1. На i-том шаге A[i] сравнивается с min. Если A[i] > min, значение min не меняется. На рисунке изображена ситуация, в которой на j-том шаге просмотра A[j] < min, поэтому min принимает значение A[j], а Index – значение j. Просмотр заканчивается через n-1 шаг.