
- •Кафедра Iнформатики
- •«Наука вся - лишь море заблуждений, где нету дна, а правды нет и тени»
- •«Складні проблеми завжди мають прості, легкі для розуміння невірні розв'язання» (закон Гросмана) Формалізація алгоритму
- •«Ускладнювати просто. Спрощувати складно» (закон Мейера) Алгоритмічні системи
- •... Sk0 skj1 skj2 ... Qi sjk ... Skjr-1 skjr sk0 ..., k[1;n]
- •Відлагодження алгоритму
- •«Якщо факти не підтверджують теорію, то їх треба позбутися» (Закон Майєрса) Етапи розв’язання задач на комп’ютері
- •Математична модель
- •Інформаційна модель
- •«Перед тим, як увійти, подумай, як вийти» (Китайське прислів'я) Техноогії проектування алгоритмів
- •«Створіть систему, якою зможе скористатися навіть дурень, і тільки дурень захоче нею користуватися»
- •(Принцип Шоу)
- •Блок-схема алгоритму лінійної структури
- •Алгоритм розгалуженої структури
- •Блок-схема алгоритму розгалуженої структури
- •Алгоритми циклічної структури
- •Алгоритм циклічної структури (параметр циклу змінюється з кроком у заданому сегменті)
- •Блок-схема алгоритму циклічної структури (параметр циклу змінюється з кроком у заданому сегменті)
- •Алгоритм циклічної структури (параметр циклу є елементом масиву)
- •Блок-схема алгоритму циклічної структури (параметр циклу є елементом масиву)
- •Алгоритм складної циклічної структури
- •Блок-схема алгоритму складної циклічної структури
- •Алгоритм обліку суми і добутку
- •Блок-схема алгоритму обліку суми і добутку
- •Алгоритм пошуку мінімуму і максимуму
- •Блок-схема алгоритму пошуку мінімуму і максимуму
- •Алгоритми сортування наданих
- •«Маленька практика краща за велику теорію» (закон Букера)
- •Алгоритми розв’язання інженерних задач
- •Ізоляція кореня
- •Уточнення значення кореня
- •Блок-схема алгоритму методу хорд
- •Початок циклу
- •Кінець циклу
- •Алгоритм розв’язання системи лінійних рівнянь
- •1. Прямий хiд
- •2. Зворотній хiд
- •Блок-схема алгоритму методу Гауса
- •Алгоритми розв’язання диференціального рівняння
- •Алгоритми до методу Эйлера
- •Алгоритми до методу Рунге - Кутта
- •Блок-схеми алгоритмів розв’язання диференціальних рівнянь першого порядку
- •Блок-схеми алгоритмів розв’язання диференціальних рівнянь другого порядку
- •Алгоритм обліку визначеного інтегралу
- •Алгоритм до методу Ньютона - Котеса
- •Блок-схема алгоритму обліку визначеного інтегралу методом Ньютона - Котеса Функція «Інтеграл»
- •Алгоритми апроксимації і інтерполяції функції
- •Алгоритм до методу інтерполяції поліномами Лагранжа
- •Алгоритм до методу апроксимації та інтерполяції в-сплайнами
- •Блок-схеми алгоритмів інтерполяції і апроксимації функції
- •Алгоритм статистичної обробки результатів експерименту
- •Перспективи розвитку теорії алгоритмів «Як тільки теорія стає зрозумілою всім, її пора змінювати» (закон Джексо на)
... Sk0 skj1 skj2 ... Qi sjk ... Skjr-1 skjr sk0 ..., k[1;n]
по одному слову на кожну k-ту стрічку.
Така машина може переходити у наступний стан безпосередньо після таких дій:
стан кожної поточної чарунки заміняється новим станом (він може співпадати зі старим);
кожна стрічка зрушується на одну чарунку управо, уліво або ж залишається нерухомою;
внутрішній стан qi пристою керування перетворюється у стан qj, який може співпадати зі старим.
Задати програму багатострічкової машини - значить для кожного слова:
qisα1 ... sαk (i [1;n]; {αj}k [1;n])
задати ябияку команду:
qisα1 ... sαk qjsβ1T1 ... qisβkTk, T {Л, С. П}
Універсальна машина Тюрінга
До цього часу ми притримувалися тієї точки зору, що різні алгоритми здійснюються на різних машинах Тюрінга, які відрізняються набором команд, внутрішнім і зовнішнім алфавітами. Проте можна побудувати і універсальну машину Тюрінга, спроможну виконувати будь-який алгоритм.
В універсальній машині Тюрінга інформація також зображується символами скінченого зовнішнього алфавіту, які розташовано на магнітній стрічці. Проте така машина повинна бути пристосована до сприйняття в якості вхідної інформації всіляких станив пристрою керування і конфігурацій, у яких можуть зустрітися літери із різноманітних алфавітів із якою-завгодно кількістю різноманітних символів. Це досягається шляхом кодування конфігурації і програми абиякої даної машини Тюрінга в символах вхідного (зовнішнього) алфавіта універсальної машини.
Саме кодування повинно виконуватися у такий спосіб:
різні букви повинні замінятися різними кодовими групами, але одна і та ж буква повинна замінятися усюди, де вона не зустрілася, однією і тією ж кодовою групою;
рядки кодових записів повинні однозначним чином розбиватися на окремі кодові групи;
повинна мати місце можливість розпізнати, які кодові групи відповідають різноманітним зрушенням інформаційної стрічки, і розрізнавати кодові групи, які відповідають буквам внутрішнього алфавіту і буквам зовнішнього алфавіту.
Розгляньмо приклад такого кодування:
|
Буква |
Кодова група |
Правило |
Рух |
Л |
101 |
Один нуль |
С |
1001 |
Два нулі |
|
П |
10001 |
Три нулі |
|
Зовнішній Алфавіт |
S1 |
100001 |
Парна кількість нулів, більша 2 |
S2 |
10000001 |
||
. . . |
. . . |
||
Sk |
1(2·k+1 нулів)1 |
||
Внутрішній алфавіт (стан) |
q1 |
1000001 |
Непарна кількість нулів, більша 3 |
q2 |
100000001 |
||
. . . |
. . . |
||
qm |
1(2·(m+1)+1 нулів)1 |
Так, наприклад, для машини Тюрінга, яке переробляє слово bcadc у слово bcdcc, вхідне слово з даним кодом буде подано рядком:
10000001 1000000001 100001 100000000001 1000000001,
, де 100001 - а, 10000001 - b, 1000000001 - c, 100000000001 - d.
Програма ж буде подана рядком:
1000001 10000001 1000001 10000001 101
1000001 1000000001 1000001 1000000001 101
1000001 100001 100000001 100001 101
100000001 100000000001 10000000001 1000000001 10001
10000000001 100001 100000000000001 100000000001 10001.
Таким чином, якщо яка-небудь машина Тюрінга розв’язує деяку задачу, то й універсальна машина Тюрінга може розв’язати цю задачу за умови, що окрім кодів вхідних наданих цієї задачі на її стрічку буде подано код програми.
Сучасні комп’ютери будуються як універсальні, а в запам’ятовувальний пристрій, поряд із даними для поставленої задачі вводиться також і програма її розв’язання. Проте, на відміну від машини Тюрінга, яка має необмежену зовнішню пам’ять (інформаційну стрічку), у будь-якому реальному комп’ютері пам’ять скінчена.
Для порівняння структур різних машин Тюрінга і оцінки їх складності необхідно мати відповідну міру. Шеннон запропонував розглядати в якості такої міри критерій: «добуток кількості символів зовнішнього алфавіту і кількості внутрішніх станів, відмінних від заключного».
Нарешті треба зазначити, що з математичної точки зору машина Тюрінга - просто визначений алгоритм для переробки слів, - тому математичні операції композиції, виконувані над алгоритмами, дозволяють утворювати нові, більш складні алгоритми з відомих простих алгоритмів.
Алгоритмічна система Маркова заснована на відповідності між словами в абстрактному алфавіті і містить у собі об'єкти подвійної природи: элементарні оператори й елементарні розпізнавачі. Елементарні оператори- оператори алфавіту, послідовне виконання яких реалізує будь-які алгоритми в аналізованій алгоритмічній системі. Елементарні розпізнавачі5 виконують розпізнавання присутності тих або інших властивостей інформації, що переробляється алгоритмом, а також для зміни (у залежності від результатів розпізнавання) послідовності виконання елементарних операторів. Для визначення множини елементарних операторів і порядка їх виконання у конкретному алгоритмі зручно користуватися особливими орієнтованими графами, які називають граф-схемами алгоритмів.
Граф-схема алгоритму (її загальний вигляд наведено на мал. 1) являє собою скінчену множину вузлів, з’єднаних між собою відповідно наступним правилам:
вузол «вхід» не має вхідних дуг (це позначається як Р+(х) = 0), але має одну вихідну дугу (Р-(х) = 1);
кожному вузлові, окрім «входу» і «виходу», зіставляється елементарний оператор або розпізнавач;
у загальному випадку кількість дуг, що входять у вузол граф-схеми, може бути довільною;
в окремому випадку (див. мал. 3):
- у кожний вузол, якому зіставлено елементарний розпізнавач, входить по дві дуги (Р+(х) = 2) і з кожного такого вузла виходить по дві дуги (Р-(х) = 2);
- у кожний вузол, якому зіставлено елементарний оператор, входить по одній дузі (Р+(х) = 1) і з кожного такого вузла виходить по одній дузі (Р-(х) = 1);
вузол «вихід» має одну вхідну дугу (Р+(х) = 1) і не має вихідних дуг (Р-(х) = 0);
Вихід
Вхід
Р+(х)
= 0
Р-(х)
= 1
Р+(х)
= 1
Р-(х)
= 0
Р+(х)
= 2
Р-(х)
= 2
Р+(х)
= 2
Р-(х)
= 2
Р+(х)
= 2
Р-(х)
= 2
Р+(х)
= 1
Р-(х)
= 1
Р+(х)
= 1
Р-(х)
= 1
Р+(х)
= 1
Р-(х)
= 1
Граф-схема
алгоритму
Мал. 3
Алгоритм, визначений граф-схемою, працює таким чином. Вхідне слово надходить на вхід і рухається по напрямкам, зазначеним стрілками. При влученні слова в розпізнавальний вузол здійснюється перевірка умови, зіставленої вузлові. При виконанні умови слово спрямовується в операторний вузол, при невиконанні, - у наступний розпізнавач. Якщо вхідне слово р, яке подано на вхід граф-схеми, проходить через її вузли, перетворюється і кінець-кінцем потрапляє через скінчену кількість кроків на вихід, то враховується, що алгоритм можна застосовувати до слова р (тобто слово р входить в область визначення цього алгоритму). Результатом впливу на слово р буде те слово, що потрапляє до виходу граф-схеми. Якщо ж після подачі слова р на вхід граф-схеми перетворення і прямування слова вздовжо граф-схеми продовжується нескінчено довго, не приводячи на вихід, то враховується, що алгоритм не можна застосовувати до слова р (тобто слово р не входить в область визначення алгоритму).
У нормальних алгоритмах в якості элементарного розпізнавача використовується розпізнавач входження, а в якості элементарного оператора - оператор підстановки. Розпізнавач входження перевіряє умову «слово р входить у якості підслова у деяке надане слово q ?». Оператор підстановки заміняє перше зліва входження слова рi у слово q на деяке надане слово р2. Оператор підстановки за звичай задається у вигляді: рi р2. Наприклад, для слова abcabca застосування підстановки bccb через два кроки:
abcabca acbabca
abcacba acbacba
призводить до слова acbacba. Послідовність слів p1, p2, ..., pn, одержуваних у процесі реалізації алгоритму, називається дедуктивним ланцюжком.
Алгоритм, що задається граф-схемою, яку складено виключно з розпізнавачів входження слів і операторів підстановки, називають узагальненим нормальним алгоритмом. При цьому передбачається, що до кожного оператора підстановки веде лише одна дуга, що виходить із відповідного розпізнавача (Р+(х) = 1).
Нормальним алгоритмом називають такий узагальнений нормальний алгоритм, граф-схема якого задовольняє наступним вимогам:
всі вузли, що відповідають розпізнавачам, упорядковано за їхньою нумерацією від 1 до n.
вихідні дуги вузлів, що відповідають операторам підстановки, під’єднуються або до вузла, відповідного першому розпізнавачу, або до вихідного вузла. У першому випадку підстановка називається звичайною, у другому - заключною.
вхідний вузол під’єднується дугою до першого розпізнавача.
Нормальні алгоритми прийнято задавати упорядкованою множиною підстановок всіх операторів алгоритму (тобто схемою алгоритму). При цьому звичайні підстановки записуються у вигляді рiр2, а заключні підстановки - у вигляді рi · р2 (з точкою після стрілки). Процес виконання підстановок завершується лише тоді, коли жодна з підстановок не застосовна до отриманого слова або коли виконано заключну підстановку.
Розгляньмо, наприклад, роботу нормального алгоритма Маркова, який задано алфавітом A = {+, 1} і системою підстановок: 1+111 та 1· 1 (граф-схему алгоритму наведено на мал. 4).
Нехай на вході задано рядок 11+11+1. Тоді наведеним алгоритмом його буде перетворено на рядок 11+11+11111+11111111111. Таким чином, алгоритм реалізує додавання одиниць.
Наявність у нормальних алгоритмах підстановок двох видів: звичайної і заключної є необхідною умовою універсальності нормальних алгоритмів, яка формулюється як принцип нормалізації: «Для абиякого алгоритму у довільному скінченому алфавіті А можна побудувати эквівалентний йому нормальний алгоритм над алфавітом А».
На основі відомих нормальних алгоритмів можуть бути побудовані нові алгоритми шляхом застосування різноманітних засобів композиції алгоритмів:
суперпозиції алгоритмів А і В, коли вихідне слово алгоритму А розглядається як вхідне слово алгоритму В;
об’єднання алгоритмів А і В в алгоритм С, що перетворює абияке слово р, що міститься на перетинанні областей визначення алгоритмів А і В, в розташовані поряд слова A(p) i B(p).
Вихід
Вхід
Мал . 4
Наприклад, якщо задано: X = {a, b}, A = {ab ba}, B = {ba ab} і слово аbа із області перетинання, то: A(aba) = baa, B(aba) = aab, C(aba) = baaaab;
розгалуження алгоритмів, тобто композиції D алгоритмів A, B і C, область визначення якої співпадає з перетинанням областей визначення алгоритмів A, B і C, а для абиякого слова р з цього перетинання:
D(p) = A(p), якщо C(p) = e,
D(p) = B(p),
C(p) e
, де е - порожній рядок.
Наприклад, якщо задано: A = {abba}, B = {baab}, C = {aba, ba e} в алфавіті X = {a, b}, то дії алгоритму D можна уявити як:
A(aba) = baa A(bab) = bba
B(aba) = aab B(bab) = abb
C(aba) = aa C(bab) = e
D(aba) = aab D(bab) = bba
повторення (ітерація) являє собою комозицію С двох алгоритмів А і В. Для будь-якого вхідного слова р відповідне йому вихідне слово С(р) утворюється у результаті послідовного багатократного застосування алгоритму А до тих пір, поки не утвориться слово, що переробляється алгоритмом В в деяке фіксоване слово.
Наприклад, якщо задано: X = {a, b}, A = {abba}, B = {bbbaaab}, тоді C(ababb) = ab, оскільки: babbbaabbbababbbabbbbababbbaaab.
Важливе значення має можливість побудови складового універсального алгоритму, що може виконувати будь-які нормальні алгоритми; на його основі може бути побудовано універсальний комп’ютер.
Однією з особливостей абстрактної теорії алгоритмів є незмінність набору припустимих засобів побудови алгоритму і його виконання. Наприклад, усі частково рекурсивні функції утворюються з фіксованого набору базисних функцій за допомогою операторів підстановки, примітивної рекурсії і найменшого кореня. Проте створення конкретних алгоритмів потребує, щоби кожний алгоритм описувався у термінах своїх, найбільш зручних елементарніх засобів. Наприклад, алгоритм лінійної алгебри зручніше описувати за допомогою арифметичних дій, а алгоритм обліку функцій алгебри логіки - за допомогою логічних операцій.
Тому першою вимогою, що пред’являється до алгоритмічної системи при практичному використанні алгоритму, є: «вигляд інформації, що переробляється, і засоби її переробки повинні обиратися у залежності від класу алгоритму».
У кожній класичній алгоритмічній системі список команд, що перетворюють вхідні надані на кінцевий результат, фіксується зазделегідь і явно вказується у запису алгоритму. Наприклад, список дій машини Тюрінга під час її роботи є незмінним. Проте можливість формування команд алгоритму у процесі його реалізації суттєво скорочує і спрощує запис алгоритму.
Тому другою вимогою, що пред’являється до алгоритмічної системи при практичному використанні алгоритму, є: «допускається формування команд алгоритму у процесі його виконання».
Розгляд реальних алгоритмів показує, що елементарні операції, які вироблено у процесі виконання алгоритмів, розпадаються на дві арифметичні і логічні. Арифметичні операції перетворюють інформацію, а логічні визначають подальший напрямок обліку. Проте, логічні операції в класичних алгоритмічних системах носять тривіальний характер. Наприклад, у машині Тюрінга логічною операцією є вибір напрямку руху інформаційної стрічки у залежності від стану машини і прочитаного символу. Така тривіальність логічних операцій сильно ускладнює побудування конкретних алгоритмів.
Тому третьою вимогою, що пред’являється до алгоритмічної системи при практичному використанні алгоритму, є: «в алгоритмі допускається використання універсальних логічних операцій».
Здебільше цим вимогам відповідають операторні алгоритмічні системи,
що й розглядаються далі.
Операторні алгоритми Ван Хао
Операторний алгоритм Ван Хао задається послідовністю наказів спеціального вигляду:
-
i
:
ω
α
β
Виконати такий наказ над числом х - значить знайти число ω(x) і далі: якщо ω(x) визначено, то перейти до виконання над ω(x) наказу з номером α; якщо ж ω(x) не визначено, то перейти до виконання над числом х наказу з номером β.
Наприклад, нехай:
x / 6
, якщо x
= 24
ω(x) =
не визначено, якщо x 24
Тоді, якщо над числом x = 24 виконати наказ:
-
i
:
ω
7
12
, то одержимо число 4 і вказівку виконувати далі над числом 4 наказ із номером 7. Якщо ж виконати цей наказ над числом 23, то одержимо вказівку виконувати над числом 23 наказ із номером 12.
У термінах машини Тюрінга номера наказів відповідають номерам конфігурацій машини, а елементарна операція над об’єктом - елементарній дії над конфігурацією деякого стану.
Заключному стану машини Тюрінга відповідає наказ:
-
i
:
стоп
, який означає, що облік варто зупинити. Число, над яким виконується цей наказ, є результатом обліку.
Програмою операторного алгоритму Ван Хао називається послідовність наказів:
-
i
:
ω
α
β
...
:
...
...
...
i + s
:
ωi+s
αi+s
βi+s
i+n
:
стоп
Якщо у результаті виконання алгоритму не буду здійснено переходу до наказу «стоп», то результатом переробки x буде «невизначене значення».
Існує теорема Мінського, яка доказує, що «абияку частково рекурсивну функцію можна обчислити за допомогою операторного алгоритму Ван Хао, якщо всі функції команд кодуються двійковими числами». Ця сентенція дозволяє реалізовувати програми операторних алгоритмів Ван Хао на універсальних комп’ютерах.
Операторні алгоритми Ляпунова
Алгоритмічна система Ляпунова, запропонована у 1953 р., стала однією з перших, що задовольняла усім вимогам до конкретних алгоритмів.
Для опису будови алгоритмів Ляпунов використав спеціальний математичний апарат - так називані «логічні схеми алгоритмів». Логічна схема може містити:
оператори - команди, що переробляють інформацію; спеціальний оператор «ЗУПИНКА» позначає завершення роботи алгоритму;
логічні умови, які перевіряються із метою визначення подальшого перебігу виконання операторів алгоритму; при записі умов використовується загально прийнята символіка математичної логіки; наприклад, x < y позначає логічну умову, що може приймати значення «істина», якщоx дійсно менше, ніж y чи «брехня», якщо x не менше, ніж y;
переходи, які використовуються для зміни порядку виконання операторів алгоритму; вони позначаються N праворуч від логічної умови (тут N - унікальна позначка кожного напрямку переходу); оператор, до якого виконується перехід, позначається поміткою N.
Логічна схема операторного алгоритму Ляпунова записується у природному порядку виконання операторів (зліва - направо) і завершується, якщо виконано оператор «ЗУПИНКА», або ж при відсутності в алгоритмі оператора, який повинен працювати далі.
Для запису алгоритмів використовуються оператори:
арифметичні, що виконують арифметичні дії; вони позначаються заголовними (великими) літерами латинського алфавіту, наприклад: А, В, С;
перевірки логічних умов, що визначають порядок роботи команд алгоритму; вони позначаються рядковими (малими) літерами латинського алфавіту, наприклад: p, q, s; якщо умова має значення «істина», то виконується наступний оператор, інакше виконується оператор, який має відповідну помітку;
переадресації, що:
- змінюють адреси у наказах;
- змінюють параметри, від яких залежить виконання операторі програми;
- відновлюють значення параметрі і адрес, які було змінено під час роботи алгоритму;
Оператори переадресації позначаються F(α), де α - адреса або параметр. Наприклад, F(i) збільшує і на 1, Fn(i) збільшує і на n, F-n(i) зменшує і на n і т.і..
перенесення [α β], що записує значення α у змінну β;
формування, що ініціює початкові значення деяких параметрів чи розташовує деякі зазделегідь визначені накази у визначені місця алгоритму. Оператор формування можна використовувати замість оператора переадресації, коли кількість переадресацій може бути довільною, а початкове значення параметру завжди те ж саме. Наприклад, якщо початкове значення параметру і дорівнює s, то оператор формування може бути записано як {si}.
Розгляньмо приклад запису операторного алгоритму Ляпунова для підсумовування п'ятьох чисел: а1, а2, а3, а4, a5.
Нехай оператор Ai розраховує значення виразу cі = ci-1 + ai, а параметр с розраховується як:
5
с = ai
i=1
Тоді операторний алгоритм Ляпунова для обліку суми має вигляд:
[1i] [0ci-1] N Ai F(i) p(i=6) N ЗУПИНКА
Це позначає такі кроки алгоритму:
Покласти i=1, c0 = 0.
Розрахувати cі = cі-1 + aі.
Збільшити і на 1.
Перевірити, чи значення логічної умови i=6 є «істиною»; якщо ні, то перейти до кроку , інакше зупинитися.
Блок-схемний метод алгоримізації передбачає розподіл усього обчислювального процесу на окремі кроки, які позначаються графічними зображеннями - «блоками». Блок-схемою алгоритму називається стандартизоване (див. ГОСТ 19.701-90) графічне зображення алгоритму, кожному кроку якого відповідає блок. Звичайне співвідношення розмірів сторін блоку таке, що його довжина становить дві його висоти. Усі блоки, окрім блоків «Початок» і «Кінець», нумерують по струмах зверху-донизу і зліва-направо арабськими цифрами; номер ставлять ліворуч над блоком чи у розриві верхньої лініі блоку.
У блок-схемі може бути присутнім тільки один блок «Початок», з якого починається абиякий алгоритм, і не менше одного блока-термінатора «Кінець», яким завершується виконання алгоритму:
Блоки «Введення» і «Виведення» використовуються для введення значень наданих, список ідентифікаторів яких вони містять усередині, із зовнішніх пристроїв (клавіатури, файлу на дисці і т.і.) або виведення значень розрахункових даних на зовнішні пристрої (монітор, принтер, файл на дисці і т.і.):
Блок «Процес» (див. подальший малюнок, ліворуч) використовується для обліку даних за формулою, яку записано усередині блоку. Блок «Визначений процес» (див. подальший малюнок, праворуч) використовується для виклику на виконання підпорядкованого алгоритму:
Блок «Рішення» містить усередині умову, яка піддається сумніву; цей блок застосовується для організації розгалужень алгоритму.
Блок «Межа циклу» (типу «початок циклу» - ліворуч, типу «кінець циклу» - праворуч) застосовується для організації й обмеження циклів. Ініціююче значення параметру циклу (наприклад, X = Xn), його кінцеве значення (Xk), крок збільшення чи зменшення (X), або умова завершення циклу (X Xk) записуються усередині початкового чи кінцевого блоку у залежності від типу циклу:
Блок «Модифікація» застосовується для організації ітераційного циклу з передумовою і параметром, що змінюється з деяким кроком. Ініціююче значення, кінцеве значення і крок збільшення чи зменшення параметру циклу записують усередині блоку. Наприклад, запис X=Xn;Xk;X позначає зміну параметру X від початкового значення Xn до кінцевого значення Xk із кроком X:
Блоки у блок-схемі, як правило, мають один горизонтальний розмір, можуть викреслюватися у будь-якій орієнтації і з'єднуються лініями потоку. Ці лінії повинні бути спрямовані до центру блоку і, за звичай, підходять до нього зверху або ліворуч, а виходиять з нього знизу або праворуч. Лінії потоку закінчуються стрілкою, якщо блоки, що з'єднуються, виконуються у напрямках «ліворуч» чи «нагору», або ж лінія потоку перетерплює злам. Декілька ліній потоку можуть з'єднуватися в одну, причому місце з'єднання звичайно зсовується:
Абиякий блок можна коментувати; для цього праворуч чи ліворуч від нього накреслюють блок «Коментар» (див. подальший малюнок, ліворуч).
Частини блок-схеми на різних аркушах паперу з'єднуються за допомогою блоку «З’єднувач», усередині якого записується унікальна позначка (див. подальший малюнок, праворуч).
HIPO (Hierarchy-Input-Process-Output6) - технологія алгоритмізації, яка використовується для побудови алгоритмів обробки інформації у складних (як правило корпоративних) інформаційних системах і передбачає побудову двох типів схем:
схеми «ієрархії», яка являє собою схему підпорядкованості алгоритмів розв’язання підзадач основної задачі:
схем «Вхід - Процес - Вихід» (для кожного алгоритму схеми «ієрархії»), що використовують сиволіку блок-схемного методу алгоритмізації і показують джерела наданих, засіб іх опрацювання і приймачі результатів обліку:
Алгоритм 2.1 «Облік прибутку Східного відділку банку «Зевс»» |
|||
Вхід |
Процес |
Вихід |
Примітка |
|
Крок 1. V = 5·X - sin(X) |
|
Облік відсотку прибутку за рік |
. . . |
. . . |
. . . |
. . . |
«Складність
програми
зростає доти,
поки не
перевищить
здібностей програміста» (закон
програмування)
Оцінка
алгоритмів
Методи оцінки складності алгоритмів
В теорії алгоритмів поняття «алгоритм» за звичай уточнюється за допомогою опису «математичної моделі» обчислювальної машини. Тут можливі два підходи в залежності від того, чи оцінюється складність алгоритму (машини, програми) або складність обліку, що протікає відповідно до алгоритму.
В якості міри складності алгоритмів розглядається функціонал, котрий співвідносить кожному алгоритму А деяке число μ(А), що характеризує його громіздкість (наприклад, число команд в А, довжину запису А або ж будь-яку іншу чисельну оцінку обсягу інформації, що міститься в А). Подібні функціонали давно застосовуються в теоретико-кібернетичних дослідженнях схем, що реалізують функції алгебри логіки (Шеннон, Яблонский, Ляпунов та ін.), а також в обчислювальній математиці, де потужність схеми, за якою обчислюється багаточлен, вимірюється кількістю арифметичних операцій, що фігурують у схемі. Різниця полягає лише в тому, що в зазначених роботах розглядаються спеціальні вузькі класи функцій і спеціальні засоби опису алгоритмів.
В теорії ж алгоритмів необхідна розробка і застосування аналогічних понять для більш загальнихй ситуацій (будь-яких обчислюваних функцій, загальних концепцій алгоритму). Перші публікації, у яких такі міри складності знайшли застосування, належать Маркову й Колмогорову. К цих роботах в якості міри складності алгоритму розглядається функціонал, що співвідносить кожній парі (А, а) деяке число (А, α) (тут А - алгоритм, α - індивідуальна задача з того класу задач, що алгоритм А розв’язує). Це число характеризує складність роботи всього алгоритму А від вхідних даних α до видачі результату. Наприклад, в якості (А, α) можна брати кількість елементарних кроків, із яких складається алгоритм або обсяг пам'яті, що може знадобитися для реалізації усіх операцій під час перебігу процесу обліку і т.і. Оскільки для кожного алгоритму А однозначно визначено клас задач , що він вирішує (наприклад, функцію мети f), то можна вважати, що кожний алгоритм А характеризується функцією змінної α:
α А(α) = (А, α)
df
Іншими словами, можна вважати, що мірою складності роботи алгоритму є оператор, що зіставляє з кожним алгоритмом А відповідну функцію А(α). За звичай вважають, що міра складності алгоритму приймає лише натуральне значення, тому для кожної обчислюваної функції існує алгоритм її обліку з мінімальною складністю. Цю мінімальну складність природно розглядати як складність самої функції, тим самим і множина усіх залежних функцій упорядкована по ступеням складності цих функцій.
Якщо ж вхідною є міра складності обліку, то утворюється інша картина. Дві сигналізуючі функції А і В, можуть виявитися непорівнянними, навіть якщо вважати А < В. Тому, якщо зафіксовано деяку функцію мети f, то апріорі не ясно, чи існує для неї найкращий облік. Тут доводиться обмежуватися більш слабкою характеристикою складності самої функції f, іншими словами доводиться шукати функції: φ1 (нижня оцінка) і φ2 (верхня оцінка), такі, що:
існує алгоритм А обліку f із сигналізуючою, що не перевищує φ2;
який би не був алгоритм А обліку f, його сигналізуюча не менша ніж φ1.
Зрозуміло, що чим ближче одна до одної верхня і нижня оцінки φ1 і φ2, тим точніше охарактеризовано складність самої функції f.
Теорія складності залежить від покладених в її основу концепцій алгоритму (рекурсивні функції, машини Тюрінга і т.і.), а також від обраної міри складності. Можна було б припустити, що при переході від однієї концепцій алгоритму до іншої необхідно наново будувати теорію складності. Проте ідея моделювання одних алгоритмів іншими позбавляє нас від цього.
Розгляньмо оцінку складності алгоритму стосовно до машин Тюрінга. З кожною конфігурацією k, до якої застосовано машину Тюрінга, можна асоціювати число, що характеризує складність процесу М(k). Варіюючи k, одержимо функцію від неї, визначену на множині усіх конфігурацій, до яких дана машина застосовна. Функції такого роду називають сигналізуючими функціями.
Роботу машини М будемо характеризувати наступними сигналізуючими функціями:
Сигналізуюча часу tm(k) дорівнює тривалості процесу М(k) (тобто кількості його конфігурацій), якщо М застосовна до k і не визначена в іншому випадку. Активною зоною процесу будемо називати мінімальну частину стрічки, що обіймає активні зони всіх його конфігурацій. Активною зоною конфігурації будемо називати мінімальну зв'язкову частину стрічки, що містить оглядаєму чарунку і всі чарунки, в яких записано значущі літери.
Сигналізуюча ємності sм(k) дорівнює довжині активної зони процесу М(k), якщо М застосовна до k, і не визначена в іншому випадку.
Сигналізуюча коливань ωм(k) дорівнює кількості коливань (зміни напрямків) голівки за час tм(k), якщо М застосовна до k, і не визначена в іншому випадку.
Сигналізуюча режиму rм(k) дорівнює максимальній кількості проходжень голівки через край чарунки за час tм(k), якщо М застосовна до k, і не визначена в іншому випадку.
Зокрема, якщо в якості конфігурацій k узято початкові конфігурації для слова р, то процес буде характеризуватися сигналізуючими функціями tм(р), sм(p), ωм(р), rм(р). Поряд із ними розглядаються і функції типу:
t(n)m = max tm(p), ω(n)m = max ω m(p), s(n)m = max sm(p), r(n)m = max rm(p),
, де |p| - довжина слова р ( |p| = n), а також функції типу:
t*m (n) = max tm(γ); ω*m (n) = max ω m(γ);
s*m (n) = max sm(γ); r*m (n) = max rm(γ),
, де γ - найбільше з довжин слів рi ( γ < n).
Побудова машини дає лише верхні сигналізуючі оцінки. Знаходження ж нижніх оцінок є більш складною справою і потребує спеціальної теорії. Має місце теорема, що показує, що при наявності верхньої оцінки, для будь-якої з сигналізуючих (t, s, ω, r) і даних параметрах m и n (m - кількість символів зовнішнього алфавіту, n - кількість символів внутрішнього алфавіту) можна одержати верхні оцінки для інших.
Теорема. Для будь-якої машини М и для будь-якого слова р, до якого вона застосовна, справедливі такі нерівності:
ω(p) t(p), r(p) ω (p) + 1, s (p) |p| + 2nr(p)+1 , t(p) ms(p) · s(p) · n