Розробка уроку

Тема: бінарний пошук, тернарний пошук, пошук з поверненням мовою Pascal.

Мета:

Після вивчення матеріалу учень:

Обладнання: комп'ютери зі встановленими ОС та середовищем програмування мовою Pascal.

Структура уроку

  1. Організаційний момент.
  2. Актуалізація опорних знань.
  3. Інструктаж з ТБ.
  4. Вивчення нового матеріалу.
  5. Закріплення вивченого матеріалу.
  6. Підбиття підсумків уроку.
  7. Домашнє завдання.
Хід уроку

1. Організаційний момент
Привітання з класом, знайомство з класом. Перевірка присутності учнів.

2. Актуалізація опорних знань.
Дати відповіді на запитання:

  1. Яким словом починають оголошення:
    • використаних модулів;
    • типів;
    • сталих;
    • змінних;
    • міток?
  2. Яким символом розмежовують вказівки у коді програми?
  3. Що таке масив? Які властивості має масив? Що таке форма масиву?
  4. Назвіть відомі вам методи упорядкування лінійних масивів.

3. Вивчення нового матеріалу

(Бінарний) пошук застосовують для знаходження елемента упорядкованого масиву (послідовності) {an}, який (елемент) має значення b. Метод полягає у послідовному поділі (приблизно) навпіл діапазону номерів, у якому проводять пошук.

На початку виконання цього алгоритму:

j — менша межа діапазону номерів, на якому шукають потрібний номер, дорівнює меншій межі діапазону номерів масиву;

k — більша межа діапазону номерів, на якому шукають потрібний номер, дорівнює більшій межі діапазону номерів масиву.

Алгоритм бінарного пошуку для упорядкованого за неспаданням масиву має такий вигляд:

  1. Поки справджується нерівність jk, робити таке:

    • надати значення змінній l = [(j + k)/2] — знайти індекс l, що поділяє досліджуваний діапазон навпіл;

    • якщо al = b, завершити пошук зі знайденим номером l;

    • якщо al < b, надати значення змінній j = (l + 1), тобто вибрати для подальшого пошуку діапазон, розташований правіше від l;

    • якщо al > b, надати значення змінній k = (l – 1), тобто вибрати для подальшого пошуку діапазон, розташований лівіше від l.

  2. Завершити пошук, вважаючи його неуспішним.

Тут квадратні дужки (у першій дії всередині циклу) позначають операцію визначення цілої частини.

У програмі крім уже описаних змінних використано булеву змінну s (англійською search — шукати): s справджується, якщо шуканого номеру немає або пошук ще не завершено.

Тернарний пошук використовують для пошуку:

Алгоритм (тернарного пошуку максимуму за умови, що він досяжний лише в одній точці)

  1. Вибрати довільні точки m1 і m2, що задовольняють нерівності: l < m1 < m2 < r. Наприклад, надати значень:
    m1 = l + (rl)/3;
    m2 = r − (rl)/3.

  2. Порахувати значення функції f (m1) і f (m2).

  3. Якщо f (m1) < f (m2) — шуканий максимум поза проміжком [l, m1) — надати значення:
    l = m1.

  4. Якщо f (m1) > f (m2) — шуканий максимум поза проміжком (m2, r] — надати значення:
    r = m2.

  5. Якщо f (m2) = f (m2) — шуканий максимум поза проміжками [l, m1) і (m2, r] при строгому зростанні й спаданні f до і після точки максимума при зростанні аргумента — надати значення:
    l = m1;
    r = m2.

  6. Якщо rl < ε, вивести значення (l + r)/2, значення f у цій точці і закінчити виконання алгоритму. Інакше перейти до пункту 1.

Тут ε — дійсне число — деяка наперед задана точність пошуку. Див. програму обчислення найбільшого значення функції f (x) = 1 − x2 на проміжку [−3, 2].

Пошук з поверненням. Деякі задачі можна розв'язати, лише перебираючи гіпотези. При цьому рівнів прийняття гіпотез може бути кілька. При переборі відкидають гіпотези у разі несумісності їх з умовою задачі. Інакше кажучи, задачу розв'язують оптимізованим перебором гіпотез. Це еквівалентно руху деревом можливих кроків алгоритму з відрізанням у разі несумісності з умовою відповідних гілок дерева. Рух здійснюють доти, поки не буде отримано шуканого розв'язку (чи всіх шуканих розв'язків) або встановлено, що розв'язків немає. Такий алгоритм називають алгоритмом з поверненням.

Програмне втілення алгоритму з поверненням проілюструємо на прикладі задачі з назаю «Хід коня». На шахівниці n × n клітин стоїть на полі (x, y) шаховий кінь. Потрібно знайти такий маршрут коня (ходити згідно із шаховими правилами) обходу всієї шахівниці із заходом у кожну клітин по одному разу.

Загальна структура алгоритму така: на кожному кроці аналізувати, чи можна ще зробити хід куди-небудь (перебирати всі варіанти). Якщо можливо, робити хід (приймати гіпотезу), якщо неможливо, повертатися на один хід назад (відхиляти останню прийняту гіпотезу). Так робити до тих пір, поки кількість відвіданих клітин не стане дорівнювати n 2.

Загальний вигляд основної процедури такого алгоритму такий:

procedure step (i,x,y) {здійснення ходів з номером i з клітини (x,y)};
begin
  repeat {можна замінити на for при сталій кількості варіантів вибору}
    {вибір ходу у клітину (u,v)};
    if {хід узгоджений з умовою} then
    begin
      {здійснення ходу};
      if (i<n*n)         {якщо дошку не заповнено}
      then step(i+1,u,v) {здійснення ходів з номером i+1 з клітини (u,v)}
      else out;          {виведення розв'язку процедурою out}
      {відміна ходу}
    end
  until {інших ходів немає}
end;

У поданому вище тексті коментарі, виділені червоним кольором, потребують заміни на вказівки чи вирази, записані мовою програмування. Нижче описано, як це зробити.

Примітка. Процедура step є рекурсивною: вона викликає сама себе.

Позиції можна описати за допомогою двовимірного масиву:

var h: array [1..n,1..n] of integer;

Кожний елемент масиву h буде зберігати номер ходу, на якому було відвідано це поле, або нуль, якщо «сюди кінь ще не ходив». Якщо змінні u, v описують позицію після можливого ходу з номером i, то маємо:

{запис ходу}      h[u,v]:=i;
{витирання ходу}  h[u,v]:=0;

Опишемо (можливу) реалізацію схеми перебору ходів коня. Запровадимо сталі масиви a, b зі значеннями елементів −2, −1, 1, 2 у таких комбінаціях, щоб виконання вказівок:

u:=x+a[j];
v:=y+b[j];

при j = 1, 2, …, 8 відповідало ходу коня. Тут j — номер можливого майбутнього ходу.

const
  a: array[1..8] = (2, 1,-1,-2,-2,-1, 1, 2);
  b: array[1..8] = (1, 2, 2, 1,-1,-2,-2,-1);

До першого звернення до процедури step потрібно заповнити масив h нулями і надати значення:

h[x,y]:=1;

Тут x, y номери рядка й стовпчика клітинки, з якої кінь починає обхід таблиці. У поданому прикладі коду x = y = 1. Лише після цього викликати процедуру:

step(2,x,y);

Перевірку умови прийнятності ходу можна записати таким чином:

if (1 <= u) and (u <= n) and
   (1 <= v) and (v <= n) then
if (h[u,v] = 0) then …

— кінь не ходить за межі шахівниці та не ходить на поле, де він побував раніше (відмінені ходи не враховувати).

У поданому коді передбачено припинення виконання програми після знаходження й виведення першого розв'язку. Інакше (для отримання й виведення усіх розв'язків) потрібно вказівку halt 0 замінити на writeln для розділення розв'язків порожнім рядком.

Результат виконання програми при n = 5 такий:

  1  6 15 10 21
 14  9 20  5 16
 19  2  7 22 11
  8 13 24 17  4
 25 18  3 12 23

У програмі використано логічну змінну yes, яка справджується при наявності знайдених розв'язків. При її хибності після перебору програма виведе повідомлення про відсутність розв'язків.

Характерним для реалізованого алгоритму є те, що під час пошуку розв'язку ми поступово:

Це пояснює назву «пошук з поверненням».

Примітка. Розв'язана задача «Хід коня» — частковий випадок пошуку гамільтонового циклу.

4. Інструктаж з ТБ
5. Вироблення практичних навичок


Завдання 1. Змінити код для тернарного пошуку проміжку значень x з [0, 4], при яких вираз |x − 1| + |x − 2| набуває найменших значень.

Вказівка до виконання

  1. Нерівності-порівняння для f1 = f (m1) і f2 = f (m2) змінити на протилежні за змістом.

  2. Якщо однакові значення функції на кінцях поточного відрізка [l, r] такі самі, що й для попереднього відрізка, то мінімум функції досягається на цьому відрізку. Передбачити галуження для цього випадку.

  3. Для знаходження меж найбільшого проміжку, на якому досягається мінімум функції, використати поділ (неперервного) діапазону значень між відповід­ними межами поточного й початкового відрізків.

Завдання 2. Створити програму пошуку з поверненням для дешифрації запису дії додавання ten + ten + forty = sixty.

Вказівка до виконання

  1. Занумерувати літери у порядку першої появи при зростанні старшинства розряду.

  2. Приймати гіпотези щодо значення змінної-літери у встановленому порядку.

  3. Вести облік використаних цифр.

  4. Можна використати вкладені цикли.

6. Підбиття підсумків уроку
Виставлення оцінок.

7. Домашнє завдання

  1. Вивчити матеріал уроку.
  2. При потребі доробити завдання 1 та 2.
  3. Ознайомитися з умовами та ідеями розв'язання задач відбірково-тренувальних зборів команди міста Києва: 1.1, 4.2, 6.2, 15.2 (до крапки вказано номер завдання, після крапки вказано номер задачі) — див. посилання. Пересвідчитися у тому, що усі ці задачі розв'язано пошуком з поверненням. Звернути особливу увагу на задачу 6.2, в описі якої подано єдиний алгоритм оптимального розв'язання логічних задач. Звичайний пошук з поверненням (оптимізований перебір) без проміжних логічних висновків має істотно більший час виконання програми, ніж запропонований автором задачі.


Текст упорядкувала Хомич Катерина Петрівна, вчитель ліцею «Універсум» Шевченківського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 26.11.2018 по 30.11.2018.