(оскільки це довша відповідь, прочитайте шрифти для резюме )
Давайте візьмемо ваш приклад і пройдемо його поетапно, розуміючи мету того, що ми робимо. Ми розпочинаємо з вашої функції та мети знайти її нотацію 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)
.
Солодкий !!!