ИНФОРМАТИКА · 10 КЛАСС
Алгоритмы и массивы · Интерактивный конспект

§ 5. Поиск элементов с заданными свойствами

Научимся находить первый, последний и все подходящие элементы, подсчитывать совпадения и ускорять проверку границы с помощью барьера.

Попробовать на модели ↓
Разбираемся в теме

Основные пункты параграфа

1

Линейный поиск

При линейном поиске элементы проверяют последовательно, пока цель поиска не достигнута.

НАБЛЮДАЙТЕ И ПРОБУЙТЕ

Линейный поиск

Меняйте данные и выполняйте шаги. Цвет выделяет текущие элементы; подписи объясняют результат. Сброс возвращает исходный опыт.

В неупорядоченном массиве равное x значение может находиться где угодно. Для ответа «есть ли?» достаточно первого совпадения. Для поиска всех вхождений нужно проверить весь используемый массив. В худшем случае проверяют n элементов, в лучшем при поиске первого — один. В пустом наборе проверок нет.

Результат следует определить заранее: логический флаг, индекс или список индексов. В примерах с индексами 1..n значение 0 удобно обозначает «не найдено», поскольку оно не является допустимым индексом. Само число 0 внутри массива при этом может быть обычным искомым значением.

Главная мысль: При линейном поиске элементы проверяют последовательно, пока цель поиска не достигнута.
2

Первый, последний и все

Первое совпадение завершает поиск; последнее требует продолжения; все совпадения сохраняют отдельно.

НАБЛЮДАЙТЕ И ПРОБУЙТЕ

Первый, последний и все

Меняйте данные и выполняйте шаги. Цвет выделяет текущие элементы; подписи объясняют результат. Сброс возвращает исходный опыт.

Для первого вхождения перебирают индексы слева направо и останавливаются при равенстве. Для последнего можно записывать k := i при каждом совпадении до конца массива. Если k остаётся 0, совпадений нет. При повторах эти алгоритмы дают разные индексы.

Для количества совпадений начинают count := 0 и увеличивают счётчик только при выполнении условия. Для суммы выбранных элементов дополнительно накапливают их значения. Не путайте сумму индексов с суммой элементов. Для [4,2,4,7] и x=4 первый индекс 1, последний 3, количество 2, сумма найденных значений 8.

{ k, i, n, x: integer; a — массив с индексами от 1. }
k := 0;
for i := 1 to n do
  if a[i] = x then
  begin
    k := i;
    break; { убрать break — получить последнее вхождение }
  end;
Главная мысль: Первое совпадение завершает поиск; последнее требует продолжения; все совпадения сохраняют отдельно.
3

Поиск с барьером

Барьер гарантирует остановку поиска, но требует отдельной свободной ячейки и проверки найденного индекса.

НАБЛЮДАЙТЕ И ПРОБУЙТЕ

Поиск с барьером

Меняйте данные и выполняйте шаги. Цвет выделяет текущие элементы; подписи объясняют результат. Сброс возвращает исходный опыт.

За используемыми n элементами резервируют ячейку n+1 и помещают в неё искомое x. Теперь последовательный поиск обязательно встретит x. Внутри цикла можно не проверять k ≤ n: проверяется только a[k] <> x. После остановки k ≤ n означает настоящее совпадение, k=n+1 — сработал барьер.

Если массив заполнен до вместимости, записывать барьер за его границей нельзя. Нужна дополнительная ячейка или обычный безопасный поиск. Барьер не делает линейный алгоритм двоичным и не отменяет проверку результата: он упрощает условие повторения, но не меняет линейный рост числа сравнений.

{ a имеет как минимум n+1 доступную ячейку. }
a[n+1] := x;
k := 1;
while a[k] <> x do k := k + 1;
if k <= n then Writeln(k)
else Writeln('Не найдено');
Главная мысль: Барьер гарантирует остановку поиска, но требует отдельной свободной ячейки и проверки найденного индекса.
4

Составные условия

Свойство элемента описывают точным предикатом, проверяя его область применения.

НАБЛЮДАЙТЕ И ПРОБУЙТЕ

Составные условия

Меняйте данные и выполняйте шаги. Цвет выделяет текущие элементы; подписи объясняют результат. Сброс возвращает исходный опыт.

Можно выбирать положительные числа, значения из включённого диапазона L..R или числа, кратные ненулевому d. Условие кратности: a[i] mod d = 0. Нуль кратен любому ненулевому целому d. Для точки (x[i],y[i]) принадлежность кругу с центром в начале координат задаётся x[i]²+y[i]² ≤ R²; равенство включает границу.

В сложной задаче предикат удобно вынести в функцию. Например, число Смита должно быть составным, а сумма его цифр — совпадать с суммой цифр простых множителей с учётом повторений. 22=2·11 подходит: 2+2=2+1+1. Простые числа исключают, хотя равенство для них получилось бы автоматически.

Главная мысль: Свойство элемента описывают точным предикатом, проверяя его область применения.
Интерактивная практика

Исследуйте и примените

Проверьте модель на нескольких наборах данных, затем выполните самостоятельное задание.

НАБЛЮДАЙТЕ И ПРОБУЙТЕ

Лаборатория: проверьте свой вариант

Меняйте данные и выполняйте шаги. Цвет выделяет текущие элементы; подписи объясняют результат. Сброс возвращает исходный опыт.

Соберём главное

Шесть выводов

01

При линейном поиске элементы проверяют последовательно, пока цель поиска не достигнута.

02

Первое совпадение завершает поиск; последнее требует продолжения; все совпадения сохраняют отдельно.

03

Барьер гарантирует остановку поиска, но требует отдельной свободной ячейки и проверки найденного индекса.

04

Свойство элемента описывают точным предикатом, проверяя его область применения.

05

Индекс найденного элемента и его значение — разные результаты.

06

Сложное свойство лучше проверять отдельной функцией с ясными ограничениями.

Самопроверка

Тест: 10 вопросов

Один верный ответ. За ответ — 0,5 балла. Откройте и проверьте себя.

1. Что делает линейный поиск?

2. Сколько проверок в худшем случае при поиске первого?

3. Что означает k=0 в модели с индексами 1..n?

4. Первое вхождение 4 в [4,2,4,7] имеет индекс…

5. Последнее вхождение 4 в [4,2,4,7] имеет индекс…

6. Сколько четвёрок в [4,2,4,7]?

7. Где размещают барьер?

8. О чём говорит остановка на n+1 при барьере?

9. Кратен ли 0 числу 3?

10. Что обязательно для числа Смита?

ВыводыТестВ началоВсе параграфы
↑

Загрузка прогресса…