Podcast
Questions and Answers
Який критерій є найбільш важливим при оцінці алгоритму, особливо коли розмір вхідних даних прагне до нескінченності?
Який критерій є найбільш важливим при оцінці алгоритму, особливо коли розмір вхідних даних прагне до нескінченності?
- Обсяг пам'яті, який займає алгоритм при обробці невеликих наборів даних.
- Асимптотична складність, що показує, як зростають витрати ресурсів зі збільшенням вхідних даних. (correct)
- Точний час виконання алгоритму на конкретному процесорі.
- Простота реалізації алгоритму, незважаючи на його ефективність.
Яке з тверджень найкраще описує поняття «складність алгоритму»?
Яке з тверджень найкраще описує поняття «складність алгоритму»?
- Складність алгоритму визначається кількістю рядків коду, необхідних для його реалізації.
- Складність алгоритму визначається обсягом ресурсів (часу та пам'яті), необхідних для його виконання, як функція від розміру вхідних даних. (correct)
- Складність алгоритму визначається часом, необхідним для його виконання на конкретному комп'ютері.
- Складність алгоритму визначається легкістю його розуміння та модифікації.
У чому полягає основна відмінність між часовою та просторовою складністю алгоритму?
У чому полягає основна відмінність між часовою та просторовою складністю алгоритму?
- Часова складність застосовується лише до рекурсивних алгоритмів, а просторова — до ітеративних.
- Часова складність вимірює час виконання, а просторова складність — обсяг необхідної пам'яті. (correct)
- Часова складність враховує вплив апаратного забезпечення, а просторова складність — програмного.
- Немає суттєвої відмінності, обидва типи складності відображають ефективність використання ресурсів.
Чому при аналізі складності алгоритму використовується поняття Big O, а не точні вимірювання часу виконання?
Чому при аналізі складності алгоритму використовується поняття Big O, а не точні вимірювання часу виконання?
У яких випадках константна складність O(1) може виявитися гіршою за лінійну O(N) на практиці?
У яких випадках константна складність O(1) може виявитися гіршою за лінійну O(N) на практиці?
Який вплив має копіювання вхідних даних у новий масив на часову та просторову складність алгоритму?
Який вплив має копіювання вхідних даних у новий масив на часову та просторову складність алгоритму?
Коли слід розглядати можливість знехтування одним показником складності (часом або пам'яттю) на користь іншого?
Коли слід розглядати можливість знехтування одним показником складності (часом або пам'яттю) на користь іншого?
Яким чином константні величини впливають на асимптотичну складність алгоритму і чому їх зазвичай відкидають?
Яким чином константні величини впливають на асимптотичну складність алгоритму і чому їх зазвичай відкидають?
У чому полягає основна відмінність при обчисленні складності багатокомпонентних алгоритмів при послідовному та вкладеному виконанні?
У чому полягає основна відмінність при обчисленні складності багатокомпонентних алгоритмів при послідовному та вкладеному виконанні?
Як визначити домінуючу складність серед декількох складностей, наприклад, O(N²) + O(N) + O(log N), і чому це важливо?
Як визначити домінуючу складність серед декількох складностей, наприклад, O(N²) + O(N) + O(log N), і чому це важливо?
Чому при аналізі логарифмічної складності O(log N) основу логарифма зазвичай не вказують?
Чому при аналізі логарифмічної складності O(log N) основу логарифма зазвичай не вказують?
У чому ключова відмінність між масивом і зв'язним списком з точки зору розміщення в пам'яті та впливу на складність операцій?
У чому ключова відмінність між масивом і зв'язним списком з точки зору розміщення в пам'яті та впливу на складність операцій?
Які операції є ефективними(O(1)) для стеку та черги, і як ці структури даних визначають порядок обробки елементів?
Які операції є ефективними(O(1)) для стеку та черги, і як ці структури даних визначають порядок обробки елементів?
У чому полягає відмінність між бінарним деревом пошуку (BST) та збалансованим бінарним деревом пошуку, і як це впливає на складність операцій пошуку, вставки та видалення?
У чому полягає відмінність між бінарним деревом пошуку (BST) та збалансованим бінарним деревом пошуку, і як це впливає на складність операцій пошуку, вставки та видалення?
Як різні типи обходу бінарного дерева (in-order, pre-order, post-order) впливають на порядок відвідування вузлів, і в яких випадках кожен із них є найбільш корисним?
Як різні типи обходу бінарного дерева (in-order, pre-order, post-order) впливають на порядок відвідування вузлів, і в яких випадках кожен із них є найбільш корисним?
Які існують способи реалізації хеш-таблиць, і як вони впливають на продуктивність операцій вставки, пошуку та видалення елементів?
Які існують способи реалізації хеш-таблиць, і як вони впливають на продуктивність операцій вставки, пошуку та видалення елементів?
Чим відрізняються Directed Graph і Undirected Graph? Як це впливає на алгоритми та їх використання?
Чим відрізняються Directed Graph і Undirected Graph? Як це впливає на алгоритми та їх використання?
У чому різниця між алгоритмами Depth-First Search (DFS) та Breadth-First Search (BFS) при обході графа, та які структури даних найчастіше використовуються для їх реалізації?
У чому різниця між алгоритмами Depth-First Search (DFS) та Breadth-First Search (BFS) при обході графа, та які структури даних найчастіше використовуються для їх реалізації?
Якщо потрібно знайти найкоротший шлях між двома вузлами в графі, який алгоритм слід застосувати і чому?
Якщо потрібно знайти найкоротший шлях між двома вузлами в графі, який алгоритм слід застосувати і чому?
Що означає термін Евристика(Heuristic) і як він використовується в алгоритмі A*?
Що означає термін Евристика(Heuristic) і як він використовується в алгоритмі A*?
Яким чином обрати структуру даних та алгоритм враховуючи обмеження на наявні ресурси та відомі вхідні дані?
Яким чином обрати структуру даних та алгоритм враховуючи обмеження на наявні ресурси та відомі вхідні дані?
Flashcards
Що таке алгоритм?
Що таке алгоритм?
Послідовність дій, яка виконується для досягнення цілі, маніпулюючи вхідними даними.
Що таке складність алгоритму?
Що таке складність алгоритму?
Це оцінка роботи алгоритму, що використовується для порівняння з іншими.
Що таке асимптотична складність?
Що таке асимптотична складність?
Асимптотична складність при прагненні розміру вхідних даних до нескінченності.
Що оцінює складність алгоритму?
Що оцінює складність алгоритму?
Signup and view all the flashcards
Що таке Big O?
Що таке Big O?
Signup and view all the flashcards
Що визначає час (Time Complexity)?
Що визначає час (Time Complexity)?
Signup and view all the flashcards
Що таке просторова складність (Space Complexity)?
Що таке просторова складність (Space Complexity)?
Signup and view all the flashcards
Що таке константна складність O(1)?
Що таке константна складність O(1)?
Signup and view all the flashcards
Що таке лінійна складність O(N)?
Що таке лінійна складність O(N)?
Signup and view all the flashcards
Що таке логарифмічна складність O(log N)?
Що таке логарифмічна складність O(log N)?
Signup and view all the flashcards
Що таке багатокомпонентні алгоритми?
Що таке багатокомпонентні алгоритми?
Signup and view all the flashcards
Яке правило діє при оцінці складності?
Яке правило діє при оцінці складності?
Signup and view all the flashcards
Що таке квадратична складність O(N^2)?
Що таке квадратична складність O(N^2)?
Signup and view all the flashcards
Що таке лінійно-логарифмічна складність O(NlogN)?
Що таке лінійно-логарифмічна складність O(NlogN)?
Signup and view all the flashcards
Що таке експоненціальна складність O(2^N)?
Що таке експоненціальна складність O(2^N)?
Signup and view all the flashcards
Що таке факторіальна складність O(N!)?
Що таке факторіальна складність O(N!)?
Signup and view all the flashcards
Що таке масив (Array)?
Що таке масив (Array)?
Signup and view all the flashcards
Що таке зв'язний список (Linked List)?
Що таке зв'язний список (Linked List)?
Signup and view all the flashcards
Що таке стек (Stack)?
Що таке стек (Stack)?
Signup and view all the flashcards
Що таке черга (Queue)?
Що таке черга (Queue)?
Signup and view all the flashcards
Що таке дерево (Tree)?
Що таке дерево (Tree)?
Signup and view all the flashcards
Що таке бінарне дерево (Binary Tree)?
Що таке бінарне дерево (Binary Tree)?
Signup and view all the flashcards
Що таке бінарне дерево пошуку (Binary Search Tree)?
Що таке бінарне дерево пошуку (Binary Search Tree)?
Signup and view all the flashcards
Що таке збалансоване дерево (Balanced Tree)?
Що таке збалансоване дерево (Balanced Tree)?
Signup and view all the flashcards
Що таке закінчене бінарне дерево (Complete Binary Tree)?
Що таке закінчене бінарне дерево (Complete Binary Tree)?
Signup and view all the flashcards
Що таке повне бінарне дерево (Full Binary Tree)?
Що таке повне бінарне дерево (Full Binary Tree)?
Signup and view all the flashcards
Що таке ідеальне бінарне дерево (Perfect Binary Tree)?
Що таке ідеальне бінарне дерево (Perfect Binary Tree)?
Signup and view all the flashcards
Що таке In-Order Traversal?
Що таке In-Order Traversal?
Signup and view all the flashcards
Що таке Pre-Order Traversal?
Що таке Pre-Order Traversal?
Signup and view all the flashcards
Що таке Post-Order Traversal?
Що таке Post-Order Traversal?
Signup and view all the flashcards
Що таке Хеш-таблиця (Hash Table)?
Що таке Хеш-таблиця (Hash Table)?
Signup and view all the flashcards
Що таке колізія (Collision) в хеш-таблиці?
Що таке колізія (Collision) в хеш-таблиці?
Signup and view all the flashcards
Що таке ребро (edge)?
Що таке ребро (edge)?
Signup and view all the flashcards
Які бувають графи?
Які бувають графи?
Signup and view all the flashcards
Хто такий Сусід?
Хто такий Сусід?
Signup and view all the flashcards
Що таке Depth first traversal?
Що таке Depth first traversal?
Signup and view all the flashcards
Що таке Breadth first traversal?
Що таке Breadth first traversal?
Signup and view all the flashcards
Який вузол поєднює деревоподібну структуру?
Який вузол поєднює деревоподібну структуру?
Signup and view all the flashcards
Study Notes
Алгоритми
- Алгоритм є послідовністю дій, призначеною для досягнення певної мети шляхом маніпулювання вхідними даними.
- Ефективність алгоритмів може варіюватися, і для вибору оптимального алгоритму необхідно мати змогу оцінювати їхню ефективність порівняно між собою.
- Оцінка ефективності алгоритму називається складністю алгоритму.
Складність алгоритму та Big O
- Складність алгоритму є оцінкою обсягу роботи, необхідної для виконання цього алгоритму, що використовується для порівняння з іншими алгоритмами, які досягають того ж результату.
- Два ключові фактори, які використовуються для порівняння у програмуванні: час та пам'ять.
- Складність залежить від вхідних даних; обробка списку з 10 клієнтів вимагає менше часу та пам'яті, ніж аналогічна обробка списку з 100 000 клієнтів.
- Найважливішим є те, як збільшення обсягу вхідних даних впливає на використання ресурсів, зокрема часу та пам'яті.
Big O
- Кількість вхідних даних позначається літерою
n
. - Оцінюється функція зміни кількості операцій, які виконає алгоритм, в залежності від кількості вхідних даних
n
. - «Big O»(O-нотація) - це поняття, яке допомагає відстежувати зростання та порівнювати затрати ресурсів.
- Big O є описом верхньої можливої межі.
- TC(Time Complexity) або Час - це час, який вимірює складність.
- Наприклад, алгоритм друку всіх значень масиву int, що має
N
елементів, має складність алгоритмуO(N)
, оскільки потрібно перевірити кожен елемент масиву.
Обчислення складності алгоритму
- Кількість елементів масиву відповідає кількості ітерацій у циклі.
- Для масиву з 10 елементами потрібно 10 ітерацій, для 100 000 - 100 000.
- У прикладі, де потрібно друкувати елементи масиву, поки не зустрінеться цільове значення(goal), складність не перевищить
O(N)
.
Пам'ять (Space Complexity, чи SC)
- Хороший програміст повинен піклуватися про обсяг витраченої пам'яті чи простору.
- Просторова складність є паралельним поняттям часової складності.
- З одного боку верхня межа часу —
TC
. - З іншого — верхня межа простору
SC
. - Слід думати про часову(TC) та просторову(SC) складності одночасно.
TC та SC
- Іноді потрібно знехтувати одним показником заради іншого.
- Алгоритм, що "бігає" по вхідному масиву має
O(1)
SC. O(1)
використовується для опису константної складності алгоритму.- У прикладі, коли створюється новий масив, такого ж розміру, як і вхідний, та копіюються всі дані, ТС — O(N), SC стало O(N), а було
О(1)
.
O(1) — Константна складність (Constant)
- Алгоритм має
О(1)
складність, коли відомо скільки точно разів щось відбудеться, чи скільки пам'яті буде виділено, незалежно від зміни вхідних даних. - Алгоритм завжди використовуватиме однакову кількість ресурсів, досягнення якої слід прагнути.
- Наприклад: алгоритм друку чисел від 1 до 100 має TC і SC — O(1), оскільки точно відомо скільки потрібно ітерацій(100) та Скільки пам'яті буде виділено.
Кількість пам'яті
- У C++ int змінна займає 4 байти, у прикладі 2 змінні (n та i), які потребують
4+4=8
байтів. - Знаючи точну кількість, виділеної пам'яті, можна сказати
О(1) SC
. - Доступ до будь-якого елементу масиву має
О(1)
складність. - O(N), про який піде мова далі у розділі, швидше ніж
О(1)
.
O(N) — Лінійна складність (Linear)
- ТС — кількість ітерацій = кількості елементів.
- SC - якщо потрібно створити масив з
N
елементів, це буде O(N) SC.
O(log N) — Логарифмічна складність (Logarithmic)
O(log N)
є однією з найважливіших, оскільки багато алгоритмів мають таку складність.- Це алгоритм, у якому на кожному етапі кількість елементів зменшується вдвічі.
- Потрібно лише 9 ітерацій для
O(log N)
замість 1000 ітерацій дляO(N)
, коли маємо 1000 елементів масиву. - У математиці, логарифм використовується для вираження кількості разів, скільки потрібно помножити одне число, щоб отримати інше.
Багатокомпонентні алгоритми
- Якщо алгоритм складається з декількох кроків, для визначення складності потрібно розглядати їхню сукупність.
- Загальна складність O(N+N) = O(2N), скорочується до O(N), оскільки константи не враховуємо.
Додавання
- Складність O(N²) + O(N) спрощується до O(N²), оскільки O(N) не є домінуючою умовою зростання.
- Формула діє лише для одного набору вхідних даних.
Множення
- TC для вкладених циклів обчислюється шляхом множення складностей кожного циклу.
- ТС для двох вкладених циклів, кожен з яких має складність O(N), становить O(N*N) = O(N²).
Складні випадки
- Якщо алгоритм працює за сценарієм "зробити це, а потім коли закінчу, зробити наступне", то ітерації додаються.
- Якщо алгоритм працює за сценарієм "роблю це для кожного разу, коли роблю щось інше", то ітерації множаться.
- При спрощенні виразів складності слід відкидати не домінують умови..
O(N²) — Квадратична складність (Quadratic)
- У випадку вхідного масиву з 5 елементів кількість ітерацій становить 25(5*5).
- Поширена складність для алгоритмів сортування та операцій над двовимірними масивами.
O(NlogN) — Лінійно-логарифмічна складність(Linearithmic)
- Повільніша за лінійну складність, але значно швидша за квадратичну.
- Лінійно-логарифмічну складність застосовують в ефективних алгоритмах сортування(merge sort, quicksort).
O(2") — Експоненціальна складність (Exponential)
- Алгоритми з такою складністю часто зустрічаються у рекурсії і динамічному програмуванні.
O(N!) — Факторіальна складність (Factorial)
- Дуже швидко зростаюча складність, що може виникнути при перестановці елементів у рядку всіма можливими способами.
- Рекомендовано завжди намагатися використовувати алгоритми зі швидшою складністю,
проте бувають специфічні випадки, коли без алгоритмів з
O(N!)
не обійтись.
Структури даних
- Структура даних - це спосіб організації та зберігання даних в комп'ютері, який дозволяє ефективно отримувати до них доступ та змінювати.
Масив
- Масив - це скінченний набір елементів одного типу, які зберігаються в послідовних комірках пам'яті.
- Розташування елементів масиву в пам'яті послідовне, що дозволяє отримувати доступ до будь-якого елемента масиву за O(1).
- Для вставки або видалення елемента з масиву потрібно створити новий масив, більшого розміру, та перенести всі значення зі старого, що займає O(N).
- Доступ до комірки масиву здійснюється за індексом, шляхом додавання індексу до адреси початку масиву.
Зв'язний список (Linked List)
- Зв'язний список - це структура даних, яка є послідовністю вузлів, де кожен вузол містить дані і вказівник на наступний вузол(або на попередній та наступний, у випадку двозв'язного списку).
- Вузли можуть бути розташовані в пам'яті хаотично.
- Доступ до конкретного вузла вимагає перевірки послідовно один за одним, що займає O(N).
- Вставку/видалення вузла з початку або кінця списку можна виконати за O(1).
Стек
- Стек працює за принципом LIFO(Last-In-First-Out), коли останній прийшов — перший вийшов.
- Не використовується для доступу до елементів всередині стеку(O(N)).
- Стеки цінуються за O(1), коли потрібно додати, прочитати, видалити останній, перевірити, чи не порожній стек.
Класичні функції стеку
push(something)
: додати новий елемент.top()
: прочитати останній елемент.empty()
: перевірити, чи порожній стек.pop()
: видалити останній елемент.
Черга
- Черга(Queue) працює за принципом FIFO (First-In-First-Out), тобто перший прийшов - перший вийшов.
- Рекомендовано до використання, коли необхідно зчитати/видалити перший елемент, додати новий елемент в кінець, перевірити стан черги. Всі ці маніпуляції мають складність
O(1)
.
Класичні функції черги
push()
: додати новий елемент в кінець черги.pop()
: видалити елемент з початку черги.front()
: прочитати елемент з початку черги.empty()
: перевірити, чи порожня черга.
Дерево
- Дерево складається з вузлів і ребер, які їх зв'язують.
- Кожне дерево починається з кореневого вузла(root node), який має дочірні(child nodes).
- Дочірні вузли своєю чергою, дочірні вузли можуть мати свої дочірні вузли, і так далі.
- Вузол вважається батьківським для своїх дочірніх.
- Кореневий вузол є батьківським для всіх вузлів дерева.
- Листовий вузол(leaf node) — не має дочірніх вузлів.
- Висота дерева(height) — максимальна кількість ребер від кореневого до листового вузлів.
- Глибина дерева кількість ребер від вузла до кореневого вузла.
Бінарне дерево (Binary Tree)
- Є дерево, в якому кожен вузол має не більше двох дочірніх.
Бінарне дерево пошуку (Binary Search Tree або BST)
- Бінарне дерево, в якому значення лівого дочірнього вузла менше або дорівнює значенню батьківського, а значення правого дочірнього вузла більше N ( значення ) <.
Збалансоване та незбалансоване дерево
- Збалансованим є дерево, у якого глибина всіх листових вузлів відрізняється не більше ніж на 1.
- Якщо дерево має лише один дочірній вузол, то глибина повинна бути не більшою за 1.
Закінчене бінарне дерево (Complete Binary Tree)
- Дерево, у якому всі його рівні повністю заповнені, за винятком останнього.
- На останньому рівні дерево повинно бути заповнено зліва направо.
Повне бінарне дерево (Full Binary Tree)
- Дерево, у якого кожен вузол має нуль або два дочірні вузли.
Ідеальне бінарне дерево (Perfect Binary Tree)
- Є дерево, яке є закінченим і повним одночасно.
- Всі листові вузли знаходяться на одному рівні, який заповнений максимально можливою кількістю вузлів.
Обхід бінарного дерева(Binary Tree Traversal)
- При роботі з деревами часто застосовують рекурсію.
Види обходу бінарного дерева
- In-Order Traversal: дійти до крайнього лівого вузла, зробити дію з даними, піти вправо.
- Pre-Order Traversal: зробити дію з даними, піти вліво, потім вправо.
- Post-Order Traversal: дійти до крайнього лівого вузла, піти вправо, зробити якусь дію з даними.
Хеш-таблиця (Hash Table)
- Структура даних, яка зіставляє ключі зі значеннями для високоефективного пошуку.
Реалізації хеш-таблиці
- Масив зв'язних списків та функція гешування.
- Збалансоване дерево бінарного пошуку.
Граф (Graph)
- Колекція вузлів(nodes) та ребер(edges).
- Граф є структурою даних, що дозволяє моделювати зв'язки між об'єктами.
Підвиди графу
- Орієнтований/спрямований(Directed graph).
- Неорієтований/без напрямку(Undirected graph).
Важливі концепти
- Сусід - вузол, який знаходиться поруч та до якого можливо дістатися. Також вузол, куди можна дістатись.
- Список сумісності(Adjacency list) - уявлення графу.
- Breadth first traversal - від початкового вузла перевіряються усі сусіди по черзі, у ширину. Реалізувати даний алгоритм допомагає черга(Queue).
- Depth first traversal - у глибину. Реалізувати даний алгоритм допомагає стек(Stack) або рекурсія.
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.