Складність алгоритму

Інформація про навчальний заклад

ВУЗ:
Національний технічний університет України Київський політехнічний інститут
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2022
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Програмування складних алгоритмів

Частина тексту файла (без зображень, графіків і формул):

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ “КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО” ЗВІТ з лабораторної роботи №1 з навчальної дисципліни “Програмування складних алгоритмів” Тема: «Складність алгоритму» Варіант № 20 Дата «17» квітня 2022 Мета роботи: Метою лабораторної роботи є отримання практичних навичок визначати часову складність алгоритму. Навчитися будувати алгоритми з мінімальною часовою складністю для вирішення поставлених задач. Завдання до лабораторної роботи Сформувати двовимірний масив цілих чисел, використовуючи датчик випадкових чисел. Використати оголошення масиву на n елементів (кількість елементів задавати з екрану). Провести оцінку часової складності алгоритму, використовуючи О-символіку в найгіршому або/і в середньому. Порівняти час роботи та кількість ітерацій/кількість кроків роботи програми з різною розмірністю масиву (10x10, 50x50, 100x100, 500x500). Оцінку часу роботи навести у вигляді графіка, або таблиці. Завдання відповідно до варіанту Завдання 1: В кожному рядку масиву всі від’ємні елементи перенести в ліву частину Завдання 2: В кожному стовпчику кожен третій елемент знищити, змістивши на його місце нижні елементи. Теоретичні відомості Алгоритм – це скінченна послідовність команд, які треба виконати над вхідними даними для отримання результату. Складність алгоритму – це кількісна характеристика, що відображує споживані алгоритмом ресурси під час свого виконання. Основними ресурсами, що оцінюються, є час виконання і простір пам’яті. Основними мірами обчислювальною складності алгоритмів є: часова складність, яка характеризує час, необхідний для виконання алгоритму на даній машині; цей час, як правило, визначається кількістю операцій, які потрібно виконати для реалізації алгоритму; ємнісна складність, яка характеризує пам’ять, необхідну для виконання алгоритму. Часова та ємнісна складність тісно пов’язані між собою. Обидві є функціями від розміру вхідних даних. В алгоритму є вхід - опис завдання, яке потрібно вирішити. На його розв’язання алгоритм витрачає певний час (тобто кількість операцій). Складність - це функція від довжини входу, значення якої дорівнює максимальному (за будь-якими входами даної довжини) кількості операцій, необхідних алгоритму для отримання відповіді. Одним зі спрощених видів аналізу складності алгоритмів, що використовують при комп’ютерній їх реалізації, є асимптотичний аналіз алгоритмів. Він використовується з метою порівняння витрат часу та інших ресурсів різноманітними алгоритмами, призначеними для вирішення одного і того самого завдання. Зазвичай алгоритм, більш ефективний в асимптотичному сенсі, буде більш продуктивним для всіх вхідних даних, за винятком дуже маленьких.  Результати роботи для завдання 1 Написано програмний код, що виконує зсуву всіх від’ємних елементів кожного рядка двовимірного масиву в ліву частину. Для цього спочатку з консолі вводиться розмір масиву, після цього масив заповнюється генератором випадкових чисел та виводиться на екран. Далі масив перетворюється, виводиться час роботи алгоритму та масив в результаті обробки. Алгоритм реалізовано за допомогою двох вкладених циклів, що завжди ітеруються від 0 до розміру масиву, тому складність алгоритму: N*N = O(N2)  / Рисунок 1. Залежність часу виконання від розмірів масиву / Рисунок 2. Скріншот результату завдання 1 Результати роботи для завдання 2 Написано програмний код, що виконує видалення кожного третього елемента в кожному стовпчику та зсуву всіх наступних вгору. Спочатку з консолі вводиться розмір масиву, після цього масив заповнюється генератором випадкових чисел та виводиться на екран. Далі масив перетворюється, виводиться час роботи алгоритму та масив в результаті обробки. Так як відбувається взаємодія лише з рядками і немає потреби ітеруватись по горизонталі, алгоритм можна реалізувати лінійним алгоритмом O(n). Для виконання завдання відбувається створення нового масиву з меншою кількістю рядків та перезапис з введеного масиву всіх рядків, крім кожного третього.  / Рисунок 3. Залежність часу виконання від розмірів масиву / Рисунок 4. Скріншот результату завдання 2 Висновки У процесі виконанні лабораторної роботи було отримано практичні навички визначення часової складності алгоритму та побудови алгоритмів з мінімальною часовою складністю для вирішення поставлених задач. Код програми Завдання 1 // Lab_1 task1 #include <iostream> #include <ctime> #include <chrono> #include <iomanip> int main() { int size; std::cout << "Введіть розмірність матриці:" << std::endl; std::cin >> size; std::cout << "\nПочаткова матриця:"; int** arr = new int* [size]; srand(time(NULL)); for (int i = 0; i < size; i++) { arr[i] = new int[size]; std::cout << std::endl; for (int j = 0; j < size; j++) { arr[i][j] = rand() % 201 - 100; std::cout << std::setw(4) << arr[i][j] << " "; } } auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < size; i++) { int num = 0; for (int j = 0; j < size; j++) { if (arr[i][j] < 0) { if (j != num) { int temp = arr[i][j]; arr[i][j] = arr[i][num]; arr[i][num] = temp; } num++; } } } std::chrono::duration<double, std::milli> time = std::chrono::high_resolution_clock::now() - start; std::cout << "\n\nЧас виконання:" << time.count() << "ms\n"; std::cout << "\nРезультат:"; for (int i = 0; i < size; i++) { std::cout << "\n"; for (int j = 0; j < size; j++) std::cout << std::setw(4) << arr[i][j] << " "; } } Завдання 2 //Lab_1 task2 #include <iostream> #include <ctime> #include <chrono> #include <iomanip> #include <tgmath.h> int main() { int size; std::cout << "Введіть розмірність матриці:" << std::endl; std::cin >> size; std::cout << "\nПочаткова матриця:"; int** arr = new int* [size]; srand(time(NULL)); for (int i = 0; i < size; i++) { arr[i] = new int[size]; std::cout << std::endl; for (int j = 0; j < size; j++) { arr[i][j] = rand() % 201 - 100; std::cout << std::setw(4) << arr[i][j] << " "; } } std::cout << "\n\n"; int m1; m1 = size - (size / 3); int** arr1 = new int* [m1]; srand(time(NULL)); for (int i = 0; i < m1; i++) arr1[i] = new int[size]; auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < m1; i++) { int needed_index = (int)((1.0 / 4.0) * (6 * i + pow(-1, i) - 1)); arr1[i] = arr[needed_index]; } std::chrono::duration<double, std::milli> time = std::chrono::high_resolution_clock::now() - start; std::cout << "Час виконання: " << time.count() << "ms\n"; std::cout << "\nРезультат:"; for (int i = 0; i < m1; i++) { std::cout << "\n"; for (int j = 0; j < size; j++) std::cout << std::setw(4) << arr1[i][j] << " "; } }
Антиботан аватар за замовчуванням

22.05.2023 11:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!