Алгоритми: Складність та Big O

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Який критерій є найбільш важливим при оцінці алгоритму, особливо коли розмір вхідних даних прагне до нескінченності?

  • Обсяг пам'яті, який займає алгоритм при обробці невеликих наборів даних.
  • Асимптотична складність, що показує, як зростають витрати ресурсів зі збільшенням вхідних даних. (correct)
  • Точний час виконання алгоритму на конкретному процесорі.
  • Простота реалізації алгоритму, незважаючи на його ефективність.

Яке з тверджень найкраще описує поняття «складність алгоритму»?

  • Складність алгоритму визначається кількістю рядків коду, необхідних для його реалізації.
  • Складність алгоритму визначається обсягом ресурсів (часу та пам'яті), необхідних для його виконання, як функція від розміру вхідних даних. (correct)
  • Складність алгоритму визначається часом, необхідним для його виконання на конкретному комп'ютері.
  • Складність алгоритму визначається легкістю його розуміння та модифікації.

У чому полягає основна відмінність між часовою та просторовою складністю алгоритму?

  • Часова складність застосовується лише до рекурсивних алгоритмів, а просторова — до ітеративних.
  • Часова складність вимірює час виконання, а просторова складність — обсяг необхідної пам'яті. (correct)
  • Часова складність враховує вплив апаратного забезпечення, а просторова складність — програмного.
  • Немає суттєвої відмінності, обидва типи складності відображають ефективність використання ресурсів.

Чому при аналізі складності алгоритму використовується поняття Big O, а не точні вимірювання часу виконання?

<p>Big O дозволяє ігнорувати константи та члени нижчого порядку, зосереджуючись на домінуючій поведінці алгоритму при великих обсягах даних. (D)</p> Signup and view all the answers

У яких випадках константна складність O(1) може виявитися гіршою за лінійну O(N) на практиці?

<p>Коли константні операції мають надзвичайно великі витрати, що робить O(N) швидшим для малих значень N. (A)</p> Signup and view all the answers

Який вплив має копіювання вхідних даних у новий масив на часову та просторову складність алгоритму?

<p>Це збільшує і часову, і просторову складність. (A)</p> Signup and view all the answers

Коли слід розглядати можливість знехтування одним показником складності (часом або пам'яттю) на користь іншого?

<p>Коли вимоги до одного з ресурсів (час або пам'ять) є критично важливими, а обмеження іншого ресурсу менш суттєві. (A)</p> Signup and view all the answers

Яким чином константні величини впливають на асимптотичну складність алгоритму і чому їх зазвичай відкидають?

<p>Константні величини не впливають на асимптотичну складність, оскільки їхній внесок стає незначним при великих обсягах вхідних даних. (C)</p> Signup and view all the answers

У чому полягає основна відмінність при обчисленні складності багатокомпонентних алгоритмів при послідовному та вкладеному виконанні?

<p>У послідовних алгоритмах складності додаються, а у вкладених — перемножуються. (D)</p> Signup and view all the answers

Як визначити домінуючу складність серед декількох складностей, наприклад, O(N²) + O(N) + O(log N), і чому це важливо?

<p>Домінуючою є найбільша складність, оскільки вона визначає, як швидко зростатиме час виконання алгоритму зі збільшенням вхідних даних. (B)</p> Signup and view all the answers

Чому при аналізі логарифмічної складності O(log N) основу логарифма зазвичай не вказують?

<p>Зміна основи логарифма еквівалентна множенню на константу, що не впливає на Big O нотацію. (D)</p> Signup and view all the answers

У чому ключова відмінність між масивом і зв'язним списком з точки зору розміщення в пам'яті та впливу на складність операцій?

<p>Масив вимагає послідовного розміщення елементів у пам'яті, що забезпечує O(1) доступ за індексом, тоді як у зв'язному списку елементи можуть бути розкидані по пам'яті, що ускладнює доступ. (A)</p> Signup and view all the answers

Які операції є ефективними(O(1)) для стеку та черги, і як ці структури даних визначають порядок обробки елементів?

<p>Додавання та видалення елементів з одного кінця (стек) або з протилежних кінців (черга); стек працює за принципом LIFO (останній прийшов — перший вийшов), черга — FIFO (перший прийшов — перший вийшов). (C)</p> Signup and view all the answers

У чому полягає відмінність між бінарним деревом пошуку (BST) та збалансованим бінарним деревом пошуку, і як це впливає на складність операцій пошуку, вставки та видалення?

<p>BST не гарантує логарифмічну складність операцій, а збалансоване дерево — гарантує, забезпечуючи оптимальну продуктивність у найгіршому випадку. (A)</p> Signup and view all the answers

Як різні типи обходу бінарного дерева (in-order, pre-order, post-order) впливають на порядок відвідування вузлів, і в яких випадках кожен із них є найбільш корисним?

<p>in-order корисний для сортування, pre-order — для копіювання дерева, post-order — для видалення дерева. (A)</p> Signup and view all the answers

Які існують способи реалізації хеш-таблиць, і як вони впливають на продуктивність операцій вставки, пошуку та видалення елементів?

<p>Масиви зв'язних списків забезпечують O(1) в середньому випадку, але O(N) у найгіршому (при колізіях), тоді як збалансовані дерева гарантують O(log N) у будь-якому випадку. (A)</p> Signup and view all the answers

Чим відрізняються Directed Graph і Undirected Graph? Як це впливає на алгоритми та їх використання?

<p>У Directed Graph ребра мають напрямок, що дозволяє моделювати односторонні відносини, тоді як Undirected Graph представляє двосторонні, симетричні відносини. Це впливає на вибір алгоритмів для пошуку та обходу графа. (C)</p> Signup and view all the answers

У чому різниця між алгоритмами Depth-First Search (DFS) та Breadth-First Search (BFS) при обході графа, та які структури даних найчастіше використовуються для їх реалізації?

<p>DFS використовує стек, а BFS — чергу; DFS корисний для пошуку в глибину, а BFS — для пошуку найближчих вузлів. (C)</p> Signup and view all the answers

Якщо потрібно знайти найкоротший шлях між двома вузлами в графі, який алгоритм слід застосувати і чому?

<p>Алгоритм Дейкстри (Dijkstra's algorithm) або А*, оскільки вони враховують вагу ребер. (C)</p> Signup and view all the answers

Що означає термін Евристика(Heuristic) і як він використовується в алгоритмі A*?

<p>Евристика — це оцінка вартості шляху від поточного вузла до цільового, що допомагає алгоритму A* ефективніше досліджувати граф. (D)</p> Signup and view all the answers

Яким чином обрати структуру даних та алгоритм враховуючи обмеження на наявні ресурси та відомі вхідні дані?

<p>Ретельно проаналізувати, як кожен з доступних варіантів структури данних та алгоритму поводять себе відносно вхідних даних (розмір) та апаратного забезпеченя. (D)</p> Signup and view all the answers

Flashcards

Що таке алгоритм?

Послідовність дій, яка виконується для досягнення цілі, маніпулюючи вхідними даними.

Що таке складність алгоритму?

Це оцінка роботи алгоритму, що використовується для порівняння з іншими.

Що таке асимптотична складність?

Асимптотична складність при прагненні розміру вхідних даних до нескінченності.

Що оцінює складність алгоритму?

Кількість операцій, які виконає алгоритм, в залежності від кількості вхідних даних.

Signup and view all the flashcards

Що таке Big O?

Описання верхньої можливої межі витрат ресурсів алгоритму.

Signup and view all the flashcards

Що визначає час (Time Complexity)?

Кількість ітерацій у циклі або кількість елементів в масиві.

Signup and view all the flashcards

Що таке просторова складність (Space Complexity)?

Верхня межа простору (пам'яті), необхідного для алгоритму.

Signup and view all the flashcards

Що таке константна складність O(1)?

Алгоритм завжди використовує однакову кількість ресурсів, незалежно від вхідних даних.

Signup and view all the flashcards

Що таке лінійна складність O(N)?

Кількість ітерацій прямо пропорційна кількості елементів.

Signup and view all the flashcards

Що таке логарифмічна складність O(log N)?

Алгоритм зменшує кількість елементів вдвічі на кожному кроці.

Signup and view all the flashcards

Що таке багатокомпонентні алгоритми?

Алгоритм має декілька кроків, складність визначається додаванням або множенням.

Signup and view all the flashcards

Яке правило діє при оцінці складності?

Константні величини відкидаються, бо не впливають на прагнення до нескінченності.

Signup and view all the flashcards

Що таке квадратична складність O(N^2)?

Кількість ітерацій зростає квадратично відносно кількості елементів.

Signup and view all the flashcards

Що таке лінійно-логарифмічна складність O(NlogN)?

Повільніша за лінійну, але значно швидша за квадратичну складність, часто використовується в сортуванні.

Signup and view all the flashcards

Що таке експоненціальна складність O(2^N)?

Алгоритми, що часто зустрічаються в рекурсії та динамічному програмуванні.

Signup and view all the flashcards

Що таке факторіальна складність O(N!)?

Добуток всіх цілих чисел, більших за 0, що не перевищують дане число.

Signup and view all the flashcards

Що таке масив (Array)?

Впорядкований скінченний набір даних одного типу, що зберігаються в послідовних комірках пам'яті.

Signup and view all the flashcards

Що таке зв'язний список (Linked List)?

Структура даних, яка представляє послідовність вузлів, де кожен вузол вказує на наступний (або попередній).

Signup and view all the flashcards

Що таке стек (Stack)?

Структура даних, що працює за принципом LIFO (Last-In-First-Out).

Signup and view all the flashcards

Що таке черга (Queue)?

Структура даних, що працює за принципом FIFO (First-In-First-Out).

Signup and view all the flashcards

Що таке дерево (Tree)?

Структура даних, що складається з вузлів та ребер, які їх зв'язують.

Signup and view all the flashcards

Що таке бінарне дерево (Binary Tree)?

Кожен вузол має не більше двох дочірніх.

Signup and view all the flashcards

Що таке бінарне дерево пошуку (Binary Search Tree)?

Значення лівого дочірнього вузла менше або дорівнює значенню батьківського, а значення правого - більше.

Signup and view all the flashcards

Що таке збалансоване дерево (Balanced Tree)?

У збалансованому дереві глибина усіх листових вузлів відрізняється не більше ніж на 1.

Signup and view all the flashcards

Що таке закінчене бінарне дерево (Complete Binary Tree)?

У якому всі його рівні повністю заповнені, за винятком, можливо, останнього.

Signup and view all the flashcards

Що таке повне бінарне дерево (Full Binary Tree)?

Кожен вузол має нуль або два дочірні вузли.

Signup and view all the flashcards

Що таке ідеальне бінарне дерево (Perfect Binary Tree)?

Яке є закінченим і повним одночасно.

Signup and view all the flashcards

Що таке In-Order Traversal?

Дійти до крайнього лівого вузла, зробити дію з даними, піти в право.

Signup and view all the flashcards

Що таке Pre-Order Traversal?

Зробити дію з даними, піти вліво, потім піти вправо.

Signup and view all the flashcards

Що таке Post-Order Traversal?

Дійти до крайнього лівого вузла, піти у право, зробити дію з даними.

Signup and view all the flashcards

Що таке Хеш-таблиця (Hash Table)?

Структура даних, яка зіставляє ключі зі значеннями для високоефективного пошуку.

Signup and view all the flashcards

Що таке колізія (Collision) в хеш-таблиці?

Результат, коли хеш-функція повернула один і той самий індекс для різних ключів.

Signup and view all the flashcards

Що таке ребро (edge)?

Зв'язує два вузли та вказує на напрямок.

Signup and view all the flashcards

Які бувають графи?

Може бути орієнтованим/спрямованим (Directed graph) та неорієнтованим/без напрямку (Undirected graph).

Signup and view all the flashcards

Хто такий Сусід?

Вузол, який знаходиться поруч та до якого можливо дістатися.

Signup and view all the flashcards

Що таке Depth first traversal?

Від початкового вузла перевіряється рандомний сусід, далі від сусіда до його сусіда і так далі.

Signup and view all the flashcards

Що таке 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.

Quiz Team

Related Documents

More Like This

Big O Notation Revision
8 questions
Data Structures and Algorithms Basics
37 questions
Algorithmic Complexity and Big O Notation
10 questions
Use Quizgecko on...
Browser
Browser