(оскільки це довша відповідь, прочитайте шрифти для резюме )
Давайте візьмемо ваш приклад і пройдемо його поетапно, розуміючи мету того, що ми робимо. Ми розпочинаємо з вашої функції та мети знайти її нотацію Big Oh:
f(n) = 6n+4
По-перше, нехай O(g(n))буде нотація Великого О, яку ми намагаємось знайти f(n). З визначення Великого О, нам потрібно знайти спрощене g(n) там, де є деякі константи cі n0де c*g(n) >= f(n)вірно для всіх nбільше, ніж n0.
По-перше, давайте виберемо g(n) = 6n + 4(що дасть вихід O(6n+4)у Big Oh). У цьому випадку ми бачимо, що c = 1і будь-яке значення n0буде відповідати математичним вимогам з нашого визначення Big Oh, оскільки g(n)завжди дорівнює f(n):
c*g(n) >= f(n)
1*(6n + 4) >= 6n + 4 //True for all n's, so we don't need to pick an n0
На даний момент ми виконали математичні вимоги. Якщо ми зупинилися наO(6n+4) цьому, зрозуміло, що це не корисніше, ніж написання f(n), тому було б пропущено справжню мету нотації Big Oh: зрозуміти загальну часову складність алгоритму! Таким чином, переходимо до наступного кроку: спрощення.
По-перше, чи можемо ми спростити те, що 6nтаке Велике О O(4)? Немає! (Вправа для читача, якщо він не розуміє, чому)
По-друге, чи можемо ми спростити 4так, щоб Великий О був O(6n)? Так! У такому випадку g(n) = 6nтак:
c*g(n) >= f(n)
c*6n >= 6n + 4
У цей момент давайте виберемо c = 2з того часу лівий бік збільшуватиметься швидше (на 12), ніж правий (на 6) на кожен приріст n.
2*6n >= 6n + 4
Тепер нам потрібно знайти позитив, n0де вищевказане рівняння справедливо для всіх n, що перевищують це значення. Оскільки ми вже знаємо, що лівий бік збільшується швидше, ніж правий, все, що нам потрібно зробити, - це знайти одне позитивне рішення. Таким чином, оскільки це n0 = 2робить дійсним вище, ми знаємо, що це g(n)=6nабо O(6n)є потенційним позначенням Big Oh f(n).
Тепер ми можемо спростити 6так, щоб Великий О був O(n)? Так! У такому випадку g(n) = nтак:
c*g(n) >= f(n)
c*n >= 6n + 4
Виберемо, c = 7оскільки лівий збільшився б швидше, ніж правий.
7*n >= 6n + 4
Ми бачимо, що вищезазначене буде справедливим для всіх n, більших або рівних n0 = 4. Таким чином, O(n)є потенційним позначенням Big Oh для f(n). Чи можемо ми спростити g(n)більше? Ні!
Нарешті, ми виявили, що найпростіша нотація Big Oh - f(n)це O(n). Чому ми пройшли все це? Тому що тепер ми знаємо, що f(n)це лінійно , оскільки нотація Big Oh має лінійну складність O(n). Приємно те, що зараз ми можемо порівняти складність у часі з f(n)іншими алгоритмами! Наприклад, тепер ми знаємо , що f(n)це можна порівняти з тимчасової складністю для функцій h(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234і т.д .; тому що, використовуючи той самий процес спрощення, описаний вище, всі вони мають лінійну часову складність O(n).
Солодкий !!!