Последовательный поиск в массиве Информатика 9 класс Токар И.Н.

advertisement
Информатика ФГОСС
Последовательный поиск в массиве
Последовательный
поиск в массиве
Информатика 9 класс
Токар И.Н.
Информатика ФГОСС
Последовательный поиск в массиве
• Самый
простой
способ
поиска
элементов массива с заданными
свойствами – это последовательный
просмотр всех элементов и проверка
выполнения условий поиска.
• Такой алгоритм поиска называется
линейным или последовательным.
Информатика ФГОСС
Последовательный поиск в массиве
Последовательный массив. Поиск в
последовательном массиве.
Поиск – процедура выделения из некоторого
множества записей определенного подмножества,
записи которого удовлетворяют некоторому
заранее поставленному условию. Условие поиска
часто называют запросом на поиск. Простейшее
условие поиска – поиск по совпадению, т.е.
равенство значения ключевого атрибута i-й записи
р(i) и некоторого заранее заданного значения q.
алгоритмы всех разновидностей поиска можно
получить из алгоритмов поиска по совпадению.
Информатика ФГОСС
Последовательный поиск в массиве
Базовым методом доступа к массиву является
ступенчатый поиск – предполагает упорядоченность
обрабатываемых записей, причем безразлично по
возрастанию и по убыванию. Для определенности
будем считать, что массив отсортирован по
возрастанию. Простейшим вариантом ступенчатого
поиска является последовательный поиск. Искомое
значение q сравнивается с ключом первой записи,
если значения не совпадают – с ключом второй
записи и т.д. до тех пор, пока q не станет больше
ключа очередной записи. Поиск с одинаковой
вероятностью 1/М может окончиться на любой
записи,
поэтому
С=(1/М)Σi=(M+1)/2
или
С
пропорционально М.
Информатика ФГОСС
Последовательный поиск в массиве
Рассмотрим двухступенчатый поиск в массиве,
состоящем из записей. Для заданного М
выбирается константа dl, называемая шагом
поиска. Если необходимо отыскать запись со
значением ключевого атрибута = q, производятся
следующие действия. Значение qпоследовательно
связывается с рядом величин р(1), р(1+dl),
р(1+2dl),…, р(1+kdl) до тех пор, пока впервые будет
достигнуто неравенство.
Информатика ФГОСС
Последовательный поиск в массиве
P (1+m*dl)>=q – здесь заканчивается первая ступень
поиска. На второй ступени q последовательно
сравнивается со всеми ключами, которые имеют
номер 1+m*dl и больше до тех пор, пока в процессе
сравнений будет достигнут ключ >, больше, чем q.
извлеченные при этом записи с ключом q образуют
результат поиска. Эффективность поиска
измеряется количеством произведенных сравнений.
Для двухступенчатого поиска среднее число
сравнений примерно составляет С=М/(2*dl)+dl/2
Параметр dl – выбираемый, и естественно выбрать
его так, чтобы минимизировалось С. dl –
непрерывная переменная – производная = С'=-М/(2
dl^2)+(1/2)
Информатика ФГОСС
Последовательный
поиск в массиве
Из условия
С'=0
получаем dl= корень из М.
Вторая производная С' ' в точке х = dl
положительна, =>достигнуто минимальное
значение С.
При n-ступенчатом поиске заранее выбираются
константы n и S.
На 1 этапе ключевые атрибуты для сравнения с
искомым ключом q выбираются из массива по
закону арифметической прогрессии, начиная с р(1)
и шагом dl=М/S (окружение в меньшую сторону).
Когда впервые будет достигнут ключ р(k)>q,
выбирается шаг d2=dl/S и организуется сравнение с
этим шагом, начиная с р(k-dl). Описанные действия
повторяются n раз, причем шаг на последней
ступени поиска dn=1. Минимальное число
сравнений достигается при S=M^(1/n). И кроме того
существует оптимальное n=ln M.
Информатика ФГОСС
Последовательный поиск в массиве
Ступенчатый поиск имеет важный частный вариант –
бинарный поиск, когда S=2. Для бинарного поиска
вводится левая граница интервала поиска А и правая
граница В. Первоначально интервал охватывает весь
массив, т.е. А=0, В=М+1. Вычисляется середина
интервала i по формуле i=(А+В)/2 с окружением в
меньшую сторону. Ключ i-й записи р(i) сравнивается с
искомым значением q.
Если р(i)=q, то поиск заканчивается. В случае р(i)>q
записи с номерами i+1, i+2,…M заведомо не содержат
ключа q, и надо сократить интервал поиска, приняв
В=i.
Аналогично при p(i)<q надо взять A=i. Далее середина
интервала вычисляется заново, и все действия
повторяются. Если будет достигнут нулевой интервал,
то требуемой записи в массиве нет.
Информатика ФГОСС
Последовательный поиск в массиве
Максимальное число сравнений Сm при поиске
данных бинарным методом. Сокращение интервала
поиска на каждом шаге в худшем случае приведет к
интервалу нулевой длины, что соответствует
отсутствию в массиве искомого значения ключевого
атрибута.
После сравнения интервал поиска составит М/2
записей, после второго – М/4 и т.д. Когда интервал
поиска впервые станет меньше одного, применяемая
схема окружения результата деления даст нулевой
интервал и поиск закончится. Это соответствует
неравенству М/2(2^Cm)<=2 => Cm пропорционально
log M. Среднее число сравнений при бинарном
поиске составляет C=log(M)-1.
Информатика ФГОСС
Последовательный поиск в массиве
Во всех 3-х случаях время поиска является функцией
от числа записей М, конкретные выражения
составляют:
-для последовательного поиска (T1~M или T1=k1*M);
-для двухступенчатого поиска (T2~~корень из M или
T2=k2*корень из M);
-для бинарного поиска (T3~log M или T3=k3* log M);
Корректировка последовательного массива.
Включение новой записи (н-р, со значением ключевого
атрибута w) в последовательный упорядоченный
массив не должно нарушать его упорядоченность.
Поэтому сначала необходимо найти положение новой
записи относительно имеющихся в массиве записей.
Новая запись не может сразу занять место, где
остановился поиск, необходимо выполнить пересылку
записей, чтобы освободить его.
Информатика ФГОСС
Последовательный поиск в массиве
Поэтому время включения и использования записей
из упорядоченного массива будет складываться т.о.:
Tk=log M+M*L
L –длина 1-й записи массива.
В формуле для Tk второе слагаемое по величине
всегда значительно превышает первое, поэтому
можно считать Tk~ML
Информатика ФГОСС
Последовательный поиск в массиве
Поиск минимального (максимального)
элемента
• Минимальный элемент массива – элемент имеющий
наименьшее значение среди всех элементов, а
максимальный – наибольшее
• Для
нахождение
значения
минимального
(максимального)
элемента
массива
нужно
просмотреть все элементы массива и на каждом шаге
сравнивать значение текущего элемента с уже
найденным на предыдущих шагах значением
минимума.
Информатика ФГОСС
Последовательный поиск в массиве
Поиск минимального (максимального)
элемента
•
•
Поиск максимального среди
n элементов массива.
max:=A[1];
for i:=2 to N do
if A[i]>max then
max:=A[i];
После завершения работы в
переменной max будет
храниться значение
максимального элемента
массива.
• Поиск минимального среди n
элементов массива.
min:=A[1];
for i:=2 to N do
if A[i]<min then
min:=A[i];
• После завершения работы в
переменной min будет
храниться значение
максимального элемента
массива.
Информатика ФГОСС
Последовательный поиск в массиве
Линейный поиск элемента с заданными
свойствами
• В заданном линейном массиве
определить есть ли хотя бы один
элемент который является нечетным, не
кратным 7 числом, если “да”, то
напечатать его номер.
Информатика ФГОСС
Последовательный поиск в массиве
Определение исходных данных и
результатов
•
Исходные данные:
–
–
•
Переменная n - количество элементов в
массиве,
Переменная a – линейный массив.
Результат:
–
–
Переменная k – номер позиции, на
которой находится элемент
Вывод «нет», если элемент не найден.
Информатика ФГОСС
Последовательный поиск в массиве
Алгоритм решения задачи
•
•
Ввод исходных данных.
Для решения задачи воспользуемся алгоритмом
поиска с барьером.
–
–
–
•
Занесем элемент, удовлетворяющий условию задачи
(например, число 5) на последнее место в массив, а затем
будем просматривать элементы с начала.
Как только элемент найден, остановимся.
Если элемент найден на месте n+1, значит в исходном
массиве нет элемента, удовлетворяющего условию задачи,
иначе печатаем номер найденного элемента.
Вывод результата.
Информатика ФГОСС
Последовательный поиск в массиве
Описание переменных
•
•
•
•
Переменные n и k имеют тип integer
Переменная а имеет тип array
Элементы массива имеют тип integer.
Для работы также необходима
переменная i типа integer – счетчик
цикла.
Информатика ФГОСС
Последовательный поиск в массиве
Программа:
Var
i,k,n: integer;
a: array [1..20] of integer;
Begin
Writeln('введите количество элементов в массиве');
Readln(n);
Writeln('введите элементы');
For i:=1 to n do
Read(a[i]);
a[n+1]:=5;
k:=1;
while (a[k] mod 2=0) or (a[k] mod 7=0) do
k:=k+1;
if k=n+1 then
writeln('в массиве нет таких элементов')
else
writeln('элемент ',a[k],' стоит на месте ',k);
End.
Информатика ФГОСС
Последовательный поиск в массиве
Тестирование
• Запустите программу и введите
значение
n=5
2 7 21 3 4
• Проверьте, результат должен быть
следующим:
элемент 3 стоит на
месте 4
Информатика ФГОСС
Последовательный поиск в массиве
Подсчет количества элементов с
заданными свойствами
• В заданном линейном массиве
посчитать количество элементов,
равных заданному числу x.
Информатика ФГОСС
Последовательный поиск в массиве
Определение исходных данных и
результатов
•
Исходные данные:
–
–
–
•
Переменная n - количество элементов в
массиве,
Переменная a – линейный массив.
Переменная х – искомое число
Результат:
–
–
Переменная k количество элементов;
Если k=0, то таких элементов в массиве
нет.
Информатика ФГОСС
Последовательный поиск в массиве
Алгоритм решения задачи.
• Ввод исходных данных.
• Для решения задачи воспользуемся
алгоритмом линейного поиска.
– До просмотра элементов массива k=0.
– Будем просматривать элементы с начала.
– Как только элемент найден, увеличим
значение k.
• Проверка значения k.
• Вывод результата.
Информатика ФГОСС
Последовательный поиск в массиве
Описание переменных
• Массив целых чисел (а),
• переменные типа integer
– количество элементов (n),
– искомое число (x),
– количество найденных (k),
– текущий элемент (i);
Информатика ФГОСС
Последовательный поиск в массиве
Программа
Var
i,k,n,x: integer;
a: array [1..20] of integer;
Begin
Writeln('введите количество элементов в массиве');
Readln(n);
Writeln('введите элементы');
For i:=1 to n do
Read(a[i]);
Writeln('введите число х');
Readln(x);
k:=0;
for i:=1 to n do
if a[i]=x then
k:=k+1;
if k=0 then
writeln('в массиве нет таких элементов')
else
writeln('в массиве ',k,' элементов =',x);
End.
Информатика ФГОСС
Последовательный поиск в массиве
Тестирование
Запустите программу и введите значение
n=5
введите элементы
2 2 3 2 4
введите число х
2
Проверьте, результат должен быть следующим:
в массиве 3 элементов =2
Информатика ФГОСС
Последовательный поиск в массиве
Нахождение максимального
(минимального) элемента массива
• В заданном линейном массиве
определить, какой из элементов
минимальный или максимальный
встречается раньше.
Информатика ФГОСС
Последовательный поиск в массиве
Определение исходных данных и
результатов
•
Исходные данные:
–
–
•
Переменная n - количество элементов в
массиве,
Переменная a – линейный массив.
Результат:
–
Текстовый ответ – минимальный
встречается раньше или максимальный
встречается раньше.
Информатика ФГОСС
Последовательный поиск в массиве
Алгоритм решения задачи.
•
•
Ввод исходных данных.
Для решения задачи воспользуемся
–
–
–
•
Найдем минимальный элемент массива
(min) и его номер (nmin)
Найдем максимальный элемент массива
(max) и его номер (nmax)
Сравним значения номера
максимального и номера минимального
элементов
Вывод результата.
Информатика ФГОСС
Последовательный поиск в массиве
Описание переменных
•
•
•
•
•
Переменная n имеет тип integer
Переменная а имеет тип array
Элементы массива имеют тип integer.
Переменные min, max, nmin, nmax
имеют тип integer.
Для работы также необходима
переменная i типа integer – счетчик
цикла.
Информатика ФГОСС
Последовательный поиск в массиве
Программа
Var
i,k,n,nmin,nmax,min,max,r: integer;
a: array [1..20] of integer;
Begin
Writeln('введите количество элементов в массиве');
Readln(n);
Writeln('введите элементы');
For i:=1 to n do
Read(a[i]);
{поиск минимального элемента}
min:=a[1]; nmin:=1;
for i:=2 to n do
if a[i]<min then
begin
min:=a[i];
nmin:=i;
end;
{поиск максимального элемента}
max:=a[1]; nmax:=1;
for i:=2 to n do
if a[i]>max then
begin
max:=a[i];
nmax:=i;
end;
if nmin<nmax then
writeln('минимальный встретился раньше')
else
writeln('максимальный встретился раньше')
End.
Информатика ФГОСС
Последовательный поиск в массиве
Тестирование
• Запустите программу и введите
значение
n=5
введите элементы
2 5 1 3 4
• Проверьте, результат должен быть
следующим:
максимальный встретился
раньше
Информатика ФГОСС
Последовательный поиск в массиве
Download