Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
konspekt_lektsiy_z_informatiki.doc
Скачиваний:
17
Добавлен:
05.09.2019
Размер:
5.37 Mб
Скачать

Лекція 15 Алгоритми

В своєму повсякденному житті людина використає безліч правила, сукупностей правила і дій, завдяки яким вона вирішує задач, що виникають перед нею. Це стосується, наприклад, правил настанови дзвінка будильника на необхідну годину, правил переходу вулиці, правил визначення значень функцій по таблицям Брадиса, правил розв’язання рівнянь другого ступеня і багатьох інших задач. Причому порушення подібних правил або послідовності їх виконання може призвести до невірному результату або трагічному результату. Послідовності названих вище правив інколи називають алгоритмами. В повсякденному житті цей термін використовується рідко, значно частіше він застосовується в математиці. З арифметики відомі алгоритми визначення найбільшого загального дільника і найменшого загального знаменника, з шкільної алгебри – формули Вієтта розв’язання квадратних рівнянь (формула – це компактний запис послідовності виконання арифметичних дій), з лінійної алгебри – правило Краммера і засіб Гаусса рішення систем лінійних алгебраїчних рівнянь і т. п. Або згадаємо, як ми в початкових класах вирішували задачі: спочатку задавали собі питання "скільки?", а після цього на нього відповідали. Вже тоді ми починали навчатися будувати алгоритми, не підозрюючи про таке хитре слово. А слово це пiшло від імені видатного узбецького ученого IХ ст. Мухамеда Аль-Хорезма, що, в частковості, виклав правила виконання арифметичних дій. З течією часу "Аль-Хорезм" трансформувалося в алгоритм (алгорифм).

Якщо проаналізувати всі названі або відомі алгоритми, то можна встановити, що всі вони розчленовуються на ряд більш простих дій, що, в свою чергу, можуть бути представленi ще більш простими, і т. д., аж до елементарних операцій – арифметичних або логічних.

Особливо уважно і докладно записуються алгоритми, коли потрібне доручити виконання розрахунків комусь іншому (менш досвідченому в правилах розв’язання задачі) або ЕОМ.

ЕОМ в початку їхнього розвитку називалися електронними цифровими обчислювальними машинами (ЭЦВМ). В самій назві підкреслювалося, що ці машини можуть працювати тільки з цифрами, числами. ЕОМ виконує тільки арифметичні і логічні операції (додавання, віднімання, множення, ділення, порівняння чисел і деякі інші). Таким Чином, для того, щоб "доручити" рішення задачі ЕОМ, необхідно алгоритми розписувати до рівня арифметичних і логічних операцій (дискретність алгоритму).

При вивченні правив рішення квадратних рівнянь зважує на той факт, що формули Вієтта залишаються справедливими (тобто можуть бути використані) для будь-якого квадратного тричлена, якщо тільки дискримінант цього тричлена невід’ємна величина. Що змінюється в рішенні різноманітних таких рівнянь? Очевидно, коефіцієнти при невідомих, що підставляються в формули Вієтта замість літер а, в і з, тобто ці формули можуть застосовуватися масово незалежно від конкретних значень коефіцієнтів рівняння. Таким Чином, цей алгоритм не залежить від конкретного рівняння – він записаний в загальному вигляді.

В загальному вигляді квадратне рівняння записується як

ax2+вx+c = 0, (1.1)

формула коренів – (1.2)

Для того, щоб з загального запису (1.1) отримати конкретне рівняння, необхідно замінити літери а, в і з реальними коефіцієнтами – числами. Аналогічно слідує надійти і з (1.2). Конкретні значення коефіцієнтів а, в і с прийнято називати похідними даними задачі. Міняючи вхідні дані, будемо одержувати нові рівняння, а їхні рішення визначаються по одному і тому же алгоритму (1.2) (масовість алгоритму).

Виконавши обчислення по (1.2), отримаємо значення коренів х1 і х2 рівняння, що були невідомі, але можна сказати, що заради отримання їхніх значень і виконувалися обчислення. Значення х1 і х2 називають результатами рішення задачі. Крім того, в (1.2) використовуються вхідні дані і деякі константи, самі же формули визначають правила перетворення вхідних даних (що можуть змінюватися – варіюватися) в цей результат. Причому всі дії висловлюються або можуть бути висловлені елементарними арифметичними і логічними операціями (перевірка в2 – 4ас > 0?). Формула (1.2) задає цілком певні дії і їхня послідовність (це слідує з математичних правив записи формул і обчислень по них). Очевидно, що кожний, хто знаком з правилами виконання арифметичних операцій, буде їх розуміти і виконувати цілком певним чином (визначеність, або детермінованість алгоритму).

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

a(хх1) (хх2) = 0, (1.3)

Де х1 і х2 корені рівняння (1.1). Звідси після нескладних перетворень слідує, що

b = – (х1+х2), с/а = х1х2. (1.4)

Якщо вдасться знайти два числа, що, будучи підставлені в (1.4) замість х1 і х2, будуть задовольняти цим співвідношенням, те рівняння (1.1) також буде вирішене. Але х1 і х2 тепер вже можна визначати не по (1.2), а засобом підбору по (1.4) або яким-або іншим засобом. Зрозуміло, що алгоритм рішення поставленої задачі буде вже іншим. І стосовно до кожного алгоритму повинно дотримуватися вимога однозначністі запису. Іншим прикладом на цю тему може служити задача рішення системи лінійних алгебраїчних рівнянь з квадратною матрицею. Така система може бути вирішена або по правилу Краммера, або з допомогою засобу Гаусса, а алгоритми цих двох засобів істотно відрізняються.

З неоднозначністі алгоритмів рішення задач слідує той факт, що для рішення задачі по різноманітним алгоритмам може знадобитися різноманітний час рішення задачі. Той алгоритм, що дозволяє більш швидко вирішити задачу, буде більш ефективним (ефективність алгоритму). В залежності від класів задач,що вирішуються до ефективності алгоритмів подаються різноманітні вимоги. Так, наприклад, якщо Ви вирішили злітати в Карпати або на Кавказ на зимові канікули і прийшли в агентство Аерофлота, щоб купити квиток на літак, те Вам, можливо, прийдеться почекати хвилин 5, доки касир буде "чаклувати " зі своїм терміналом (пультом зв’язку з ЕОМ), щоб забронювати і виписати квиток. Таке чекання неприємно, але не катастрофічно – невідомо, скільки Ви вже простояли в черзі, перш ніж надалася можливість поспілкуватися з касиром, тобто 5 хв. для вас не так вже істотні, тому з деякої натяжкою можна вважати, що алгоритм резервування квитків на літаки ефективний. Зовсім інше діло, якщо аналізується ефективність роботи алгоритму, керуючого роботою космічного апарату. Якщо до моменту отримання відповіді на питання "Що робити?" Мине 5 хв., те не тяжко уявити собі, що наш апарат може полетіти цілком не туди, куди йому слідувало б летіти, а, можливо, він і зовсім вже літати не зможе або відповідь їм так і не буде отримана.

Окрім всього сказаного, конструюючи алгоритм рішення задачі, слідує піклуватися про те, щоб цей алгоритм гарантував отримання рішення поставленої задачі (результативність алгоритму). Так, наприклад, суму членів нескінченної геометричної прогресії можна підрахувати по відомій формулі, а можна адже побудувати алгоритм безпосереднього складання всіх членів цієї прогресії. Зрозуміло, що такий алгоритм теоретичні повинен працювати нескінченно довго, тобто Він не буде володіти властивістю результативності.

Тепер можна підвести деякі підсумки. Розглянуті поняття алгоритму і його властивості.

"Алгоритм – цей точний припис, визначальний обчислювальний процес, ведучий від варіюваних початкових даних до цього результату" (ДГСТ 19781-74).

Алгоритм повинен володіти наступними властивостями:

Визначеність (детермінованість) – однозначність його тлумачення всіма і кожним, не що залишає у виконавців будь-яких сумнівів в правильності розуміння. Алгоритм повинен настільки точно формулюватися, що, в випадку його застосування декількома виконавцями до одних і тих же даним, всякий раз будуть отримані одні і ті же результати;

Дискретність – подання алгоритму в вигляді послідовності кроків (елементарних операцій), здійсненність яких виконавцем (людиною або ЕОМ) не викликає сумнівів;

Масовість – придатність алгоритму для рішення будь-яких задач даного класу;

Ефективність – можливість отримання рішення задачі в прийнятні терміни;

Результативність – конечність алгоритму, тобто властивість призводити до цього результату за кінцеве число елементарних операцій в усіх тих випадках, для яких він створений.

Для чого створюються алгоритми?

Для того, щоб вирішувати з допомогою ЕОМ (а можливо, і без них) поставлені задачі.

Яким Чином працюють алгоритми?

Алгоритми переробляють (перетворюють) початкові дані в ці результати. Таким Чином, дані в алгоритмі діляться на початкові (тобто такі, що надходять (вводяться) в алгоритм і відомі до почала роботи алгоритмів) і результати (тобто такі, що виводяться з алгоритму). Окрім цих виглядів даних, в алгоритмі можуть використовуватися і дані, створювані в процесі роботи алгоритму, так звані проміжні (робітничі) дані. Наприклад, дискримінант (D) в алгоритмі рішення квадратного рівняння.

Після того, як складений алгоритм рішення задачі (припускається рішення задачі на ЕОМ), необхідно потурбуватися про підготовку введення алгоритму в ЕОМ. Звичайно алгоритм записується в вигляді, зручному для його розуміння людиною, а це не завжди прийнято для введення в ЕОМ. Для цих мети служать мови програмування. Алгоритм, записаний на такій мові, називається програмою, а процес написання програми – програмуванням. Власне програмування – це процес перекладу алгоритму з однієї системи запису в іншу. Часто цей процес називається кодуванням. Очевидно, що етап алгоритмізації вимагає більшої напруги інтелектуальних сил, ніж кодування.

В зв’язку з тим, що при виконанні етапів алгоритмізації і програмування ніхто не застрахований від помилок, необхідно ці помилки знайти і виключити з програм. Для цих мети служать тестування програм і їхнє відпрацювання.

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

Після того, як встановлений факт наявності помилки в програмі (алгоритмі), починається процес відпрацювання.

Відпрацювання – це сукупність процедур і дій, направлених на встановлення місця, характеру помилки і її виправлення.

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

Результати досліджень показують, що на тестування і відпрацювання уходить від 30 до 70% від загального часу розробки програми. Пам’ятати про це при плануванні робіт по створенню програми.