- •Розділ 2. Задача та її аналіз
- •2.1. Етапи розв’язання задач:
- •2.1.1. Постановка задачі
- •2.1.2. Побудова моделі
- •2.1.3. Розробка алгоритму
- •2.1.4. Перевірка правильності алгоритму
- •2.1.5. Аналіз алгоритму і його складності
- •2.1.6. Реалізація алгоритму
- •2.1.7. Перевірка програми
- •2.1.8. Документація
- •2.2. Типи задач
- •2.3. Принцип декомпозиції
- •2.4. Логічна схема розрахунку
- •2.5. Методи розробки алгоритмів
- •2.5.1. Методи приватних цілей, підйому і відпрацювання назад
- •2.5.2. Евристики
- •2.5.3. Рекурсія
- •Заключні зауваження
2.1.4. Перевірка правильності алгоритму
Доказ правильності алгоритму - це один з найбільш важких, а іноді й особливо стомлюючих етапів його створення.
Ймовірно, найбільш розповсюджена процедура доведення правильності алгоритму, це прогін створеної по ньому програми на різних тестах. Але тут виникають визначені труднощі. Наприклад, якщо програма відмовляється працювати чи видає результати, що не вселяють довіри, то де треба шукати помилку – у самій програмі, чи в алгоритмі, на базі якого вона створена? І, навіть якщо при перевірці «вручну» (а вона не завжди можлива) результати, видані програмою, виявилися правильними – хіба можна гарантувати, що немає вхідних даних, на яких вона не спрацює?
Набагато більш точної є наступна методика. Припустимо, що алгоритм описаний у виді послідовності кроків, скажемо від кроку 0 до кроку m. Спробуємо запропонувати деяке обґрунтування правомірності для кожного кроку. Зокрема, може знадобитися лема про умови, що діють до і після пройденого кроку. Потім спробуємо довести закінченість алгоритму, перевіривши при цьому всі придатні вхідні дані й отримані результати.
Приклад [ ]:
Алгоритм ETS настільки простий, що його правильність легко довести.
Оскільки перевіряється кожен тур, то буде перевірений і тур з мінімальною вартістю; як тільки до нього дійде черга, він запам'ятається. Він не може бути відкинутий – це відбувається тільки якщо існує тур з меншою вартістю. Але в такому випадку саме цей тур і буде мінімальним. Алгоритм повинний закінчити роботу, оскільки число турів, що перевіряються, скінчене.
Подібний метод доведення відомий як «метод вичерпування»; це самий грубий із всіх існуючих методів доведення.
Підкреслимо, що правильність алгоритму ще нічого не говорить про його ефективність. Вичерпні алгоритми рідко бувають гарними у всіх відношеннях.
2.1.5. Аналіз алгоритму і його складності
Існує ряд важливих практичних причин для аналізу алгоритмів. Однією з них є необхідність одержання оцінок або границь для обсягу пам'яті і (чи) часу роботи, що знадобиться алгоритму для успішної обробки конкретних даних. Погодьтеся, що нерозумно витратити кілька тижнів чи навіть місяців на створення програми, а потім довідатися, що вона зможе розв'язати поставлену задачу не швидше, ніж це роблять вже існуючі програми. Правда, і тут існують свої особливості. Іноді варто віддати перевагу більш повільній, але краще працюючій програмі, що дає результати кращої якості.
Важливо встановити абсолютний (хоча цей термін і не зовсім точний) критерій. Коли можна вважати розв'язок задачі оптимальним? Іншими словами, коли наш алгоритм настільки гарний, що неможливо (незалежно від наших розумових здібностей) значно його поліпшити?
2.1.6. Реалізація алгоритму
Як тільки алгоритм виражений, припустимо, у виді послідовності кроків і ми переконалися в його правильності, настає черга його реалізації, тобто написання програми для ЕОМ.
Цей істотний крок може бути досить важким. По-перше, труднощі полягають в тому, що дуже часто окремо узятий крок алгоритму може бути виражений у формі, що важко перевести безпосередньо в конструкцію мови програмування. По-друге, перед тим, як почати писати програму, необхідно відповісти на такі питання:
Які основні змінні?
Яких вони типів?
Скільки потрібно масивів, і якої розмірності?
Чи має зміст використання зв'язних списків?
Які потрібні підпрограми (можливо, вже існуючі)?
Якою мовою програмування слід користатися?
Конкретна реалізація може істотно впливати на вимоги до пам'яті і на швидкість виконання алгоритму, що є важливим.
Ще одне важливе зауваження: одна справа довести правильність алгоритму, написаного в словесній формі і зовсім інше - довести що машинна програма, що є реалізацією цього алгоритму, також правильна. Проблема неправильної роботи програми, реалізованої по правильному алгоритмі, може полягати в непомітних на перший погляд неточностях, таких, наприклад, як пропущені дужки чи помилка у формулі. Такі помилки можуть іноді становити велику небезпеку, оскільки програма буде працювати, видаючи результати, що здаються на перший погляд правильними. Тому необхідно дуже ретельно стежити, щоб процес перетворення алгоритму в машинну програму «заслуговував довіри».
