Algorithms and time: examples

Константна складність

Цей код просто виводить повідомлення "закликаю: 'відкрити двері!'" при виклику функції open_door().

Тепер, щодо пояснення константної складності: це означає, що час виконання цієї функції не змінюється зі збільшенням розміру даних чи вхідних параметрів. Навіть якщо ми викликатимемо цю функцію зі збільшеним обсягом роботи, час виконання буде залишатися сталим. У даному випадку, код просто виводить одне повідомлення, тому час виконання буде завжди однаковим, незалежно від ситуації.


Лінійна складність

Цей код перевіряє кожен артефакт у списку artifacts і порівнює його з цільовим артефактом target_artifact. Якщо артефакт знайдено у списку, функція повертає True, інакше - False.

Пояснення лінійної складності: складність цієї функції лінійна, оскільки час виконання зростає лінійно зі збільшенням розміру вхідних даних. У цьому випадку, з кожним артефактом у списку потрібно порівняти лише один раз, тому незалежно від розміру списку час виконання зростає пропорційно кількості артефактів у списку.

Логарифмічна складність

Цей код використовує алгоритм бінарного пошуку для ефективного пошуку заклинань у відсортованому списку spells за їх назвою. Алгоритм порівнює цільовий заклинання target_spell з елементом посередині списку. Якщо вони збігаються, функція повертає індекс цього заклинання у списку. Якщо ні, алгоритм визначає, у якій половині списку може міститися цільове заклинання та продовжує пошук у відповідній половині. Цей процес повторюється, доки не буде знайдено цільове заклинання або поки ліва границя пошуку не перевищить праву. Це забезпечує логарифмічну складність, оскільки на кожній ітерації кількість елементів, серед яких ведеться пошук, зменшується приблизно вдвічі.

Квадратична складність

Цей код використовує вкладений цикл для порівняння кожної пари заклинань у списку spells. По суті, внутрішній цикл перебирає всі елементи списку, починаючи з індексу, що на 1 більший за поточний елемент зовнішнього циклу, і порівнює їх. Цей процес порівняння повторюється для кожного елементу списку, що призводить до квадратичної складності.

Пошук кожної пари заклинань виконується один раз, тому навіть якщо ми порівнюємо всі можливі пари, час виконання функції зростає квадратично з розміром списку заклинань.

Експоненціальна складність

У цьому коді використовується бібліотека itertools для генерації всіх можливих комбінацій заклинань. Для кожної можливої довжини комбінації (від одного до n, де n - кількість заклинань), використовується функція combinations, щоб знайти всі комбінації заклинань цієї довжини.

Кількість можливих комбінацій зростає експоненціально з кількістю заклинань. Наприклад, якщо у вас є n заклинань, то загальна кількість можливих комбінацій буде 2^n - 1. Це означає, що час виконання цієї функції також зростає експоненціально з кількістю заклинань у вхідному списку.