
- •До лабораторної роботи № 2
- •6.050102 “Комп’ютерна інженерія”
- •1. Мета роботи
- •2. Теоретичні відомості
- •2.1. Поняття алгоритму
- •2.2. Складність алгоритмів
- •2.3. Функція трудомісткості і система позначень
- •2.4. Класифікація алгоритмів на основі функції трудомісткості
- •2.5. Інша класифікація алгоритмів
- •2.6. Елементарні операції в процедурній мові високого рівня
- •2.7. Методика аналізу основних алгоритмічних конструкцій
- •2) Конструкція розгалуження.
- •2.8. Приклади аналізу трудомісткості алгоритмів
- •3. Порядок виконання роботи
- •4. Завдання на лабораторну роботу
- •4.1. Завдання
- •4.2. Вибір варіанту індивідуального завдання
- •4.3. Варіанти завдань
- •1. Мета роботи
- •6. Контрольні питання та завдання
- •Список літератури
2.5. Інша класифікація алгоритмів
Інша, не залежна від попередньої, класифікація алгоритмів у класі NPR передбачає виділення в функції gp(D) адитивних компонент в множини D, пов'язаних зі значеннями елементів - gv(D), та їх порядком - gs(D). Будемо припускати, що функція gp(D) представлена у вигляді:
gp(D) = gv(D) + gs(D).
Виділимо в множини підмножину однорідних по суті задачі елементів — Dе , що складається з елементів
Визначимо
Dp
як множину всіх впорядкованих
послідовностей з елементів di.
Зауважимо, що в загальному випадку
Якщо
і відповідні
їм множини
,
тоді порядкова
залежність gs(D)
для
функції трудомісткості має місце, якщо
fА(D1)
≠
fА(D2)
хоча
б для однієї пари
.
Залежність від значень gv(D) припускає, що
В залежності від ступіня впливу gv(D) та gs(D) на gp(D) визначають наступні підкласи в класі NPR:
3.а. Підклас NPRS (Sequence) – підклас алгоритмів з кількісною та порядково-залежною функцією трудомісткості:
gs(D)=Ω(gv(D))
У цьому випадку трудомісткість залежить від розмірності входу і від порядку розташування однорідних елементів; залежність від значень не може бути повністю виключена, але вона не є суттєвою. У цьому випадку можна говорити про кількісно-порядковий характер функції трудомісткості.
Прикладами можуть служити більшість алгоритмів сортування порівняннями, алгоритми пошуку мінімуму та максимуму в масиві.
3.b. Підклас NPRV (Value) –підклас алгоритмів з функцією трудомісткості, що залежить від довжини входу і значень елементів в D; залежність від порядку не є визначальною:
gv(D)=Ω(gs(D))
Прикладом може слугувати алгоритм сортування методом індексів, трудомісткість якого визначається кількістю вхідних чисел і значенням максимального з них. При цьому порядок чисел у масиві взагалі не має впливу на трудомісткість, за винятком фрагмента пошуку максимального елемента, що відноситься до класу NPRS.
Відзначимо, що об'єднання цих підкласів не утворює клас NPR:
NPR \ (NPRS U NPRV) ≠ 0.
Існують алгоритми, в яких і значення, і порядок розташування однорідних елементів мають реальний і істотний вплив на функцію трудомісткості. Наприклад, такими є ітераційні алгоритми розв'язання систем лінійних рівнянь. Очевидно, що як перестановка значень у вхідній матриці, так і зміна самих значень істотно міняють власні числа матриці, які визначають збіжність ітераційного процесу одержання рішення.
2.6. Елементарні операції в процедурній мові високого рівня
Для того, щоб одержати значення функції трудомісткості, необхідно визначити які є операції в моделі обчислень.
Практичні реалізації обчилювальних алгоритмів на мові програмування високого рівня зазвичай містять у собі такі програмні фрагменти:
- діалогове або файлове введення вхідних даних;
перевірка вхідних даних на допустимість;
власне розв'язання поставленого завдання;
представлення (вивід) отриманих результатів.
При аналізу алгоритмів по трудомісткості можна вважати, що обслуговуючі фрагменти програмної реалізації, такі як введення, перевірка та вивід, є загальними або еквівалентними для різних алгоритмів розв'язання даної задачі. Такий підхід приводить до необхідності аналізу тільки безпосереднього розв'язання поставленого завдання. При цьому припускається, що вхідні дані і отримані результати будуть розміщені в «оперативній» пам'яті, включаючи в це поняття як власне оперативну пам'ять, так і кэш пам'ять, регістри і буфери реального процесора. Таким чином, множина "елементарних" операцій, що враховуються в функції трудомісткості, не включає операції введення/виведення даних на зовнішні носії.
Для мови програмування С++ такими "елементарними" операціями будемо вважати наступні:
просте присвоювання: = ;
одновимірна індексація: a[i] (адреса початку масиву + і * довжину елемента);
арифметичні операції: { * , / , - , + };
операції порівняння: < , <= , > , >= , = = , != ;
логічні операції: && (логічне AND), | | (логічне OR), & (порозрядне AND), | (порозрядне OR),
^ (порозрядне XOR) ;
операції адресації в складних типах даних: -> (посилання на член структури за допомогою
вказівника), . (посилання на член структури)
Кілька зауважень стосовно введеного набору "елементарних" операцій:
з набору елементарних операцій виключається команда переходу, оскільки її можна вважати пов'язаної з операцією порівняння в конструкції розгалуження або циклу за умовою. Таке виключення виправдане забороною використання оператора переходу на мітку в ідеології структурного програмування;
операції доступу до простих іменованих комірок пам'яті вважаються пов'язаними з операціями, операнди яких вони зберігають.