Так, я б сказав, що знати щось про складність обчислювальної техніки є обов'язковим для будь-якого серйозного програміста. Поки ви не маєте справу з величезними наборами даних, вам буде добре, не знаючи складності, але якщо ви хочете написати програму, яка вирішує серйозні проблеми, вам це потрібно.
У вашому конкретному випадку ваш приклад пошуку підключених компонентів, можливо, працював для графіків розміром до вузлів. Однак, якби ви спробували графік зі 100 000 вузлами, алгоритм вашого викладача, ймовірно, зміг би це за 1 секунду, тоді як ваш алгоритм мав би (залежно від того, наскільки складною була складність) за 1 годину, 1 день чи, можливо, навіть на 1 вічність.100100.000
Дещо поширена помилка, яку студенти роблять у нашому курсі алгоритмів, полягає в тому, щоб повторити такий масив:
while array not empty
examine first element of array
remove first element from array
Це може бути не найкрасивішим кодом, але в складній програмі щось подібне може з’являтися, не знаючи про це програміста. Тепер у чому проблема з цією програмою?
Припустимо, ми запускаємо його на наборі даних елементів. Порівняно з наступною програмою, колишня програма буде працювати на 50 000 повільніше.100.00050 000
while array not empty
examine last element of array
remove last element from array
Я сподіваюсь, що ви погоджуєтесь, що знання програми змусити вашу програму працювати в разів швидше - це, мабуть, важлива річ для програміста. Розуміння різниці між двома програмами вимагає деяких базових знань про теорію складності та деяких знань про особливості мови, якою ви програмуєте.50 000
У моїй псевдокодовій мові "видалення елемента з масиву" зміщує всі елементи праворуч від елемента, який видаляється, на одну позицію зліва. Це робить видалення останнього елемента операцією оскільки для цього нам потрібно взаємодіяти лише з 1 елементом. Видалення першого елемента є O ( n ), оскільки для того, щоб видалити перший елемент, нам потрібно зрушити всі інші n - 1 елементів на одну позицію вліво.O ( 1 )O ( n )n - 1
Дуже основна складна вправа - довести, що перша програма зробить операції, тоді як друга програма використовує лишеnоперацій. Якщо ви підключитеn=100.000,ви побачите, що одна програма значно ефективніша за іншу.12н2нn = 100.000
Це лише іграшковий приклад, але він вже потребує базового розуміння складності, щоб визначити різницю між двома програмами, і якщо ви насправді намагаєтеся налагодити / оптимізувати більш складну програму, яка має цю помилку, потрібне ще більше розуміння, щоб знайти там, де помилка. Тому що помилку, як видалення елемента з масиву таким чином, можна дуже добре приховати абстракціями в коді.
Добре розуміння складності також допомагає при порівнянні двох підходів до вирішення проблеми. Припустимо, ви придумали два різні підходи до вирішення проблеми пов'язаних компонентів самостійно: для того, щоб вирішити між ними, було б дуже корисно, якби ви могли (швидко) оцінити їх складність і вибрати кращий.