Информатика ФГОСС Последовательный поиск в массиве Последовательный поиск в массиве Информатика 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 • Проверьте, результат должен быть следующим: максимальный встретился раньше Информатика ФГОСС Последовательный поиск в массиве