Позначення Big Oh (O, Theta, Omega) стосується темпів зростання функцій.
Коли ви реалізуєте алгоритм, він має певну характеристику, як змінюється час виконання при збільшенні роботи набору даних. Тепер ви можете оптимізувати алгоритм, щоб він працював швидше на коефіцієнт 100. Звичайно, це чудово, але по суті, це все той же алгоритм. Так само за кілька років комп'ютери можуть бути вдвічі швидшими, ніж сьогодні.
Нотація Ландау абстрагує ці постійні фактори. Не важливо, чи алгоритм f
завжди вдвічі швидший, ніж інший алгоритм g
. Можливо, g
його можна оптимізувати для роботи в 4 рази швидше, або ви зможете придбати швидше апаратне забезпечення. Якщо ви подивитесь на це з цієї точки зору, ви можете сказати, що вони "однакові". (Це не означає, що ви можете (завжди) ігнорувати постійні фактори на практиці.)
Великий о вказує верхню межу, вона схожа на <=
відношення.
Погодьтесь, 1 < 2
це правда. Чи означає це, що 1
не може бути меншим за будь-яке інше число? Звичайно, ні. Існує нескінченна кількість чисел, більша за 1
.
Що стосується темпів зростання, то це схоже. O(n)
позначає набір усіх функцій, які ростуть лінійно (або повільніше). O(n^2)
з іншого боку, позначає всі ті функції, які зростають з квадратичною сумісністю (або повільніше). Я впевнений, що ви погодитесь, що лінійна функція росте повільніше, ніж квадратична.
Ось чому функція може бути в декількох класах "Big-oh".
Ось порівняння різних функцій з : (з конкретної математики Кнута)
Зліва направо функції ростуть швидше.
Крім того, значення n ^ 2 росте швидше, ніж n ^ 1, оскільки 2> 1.
Визначення
"f росте швидше або настільки ж швидко, як g"
"f росте повільніше або настільки ж швидко, як і g"
Поєднання вищезгаданих двох. Він говорить, що функція f
зростає так само швидко g
. Це відношення еквівалентності.
Інтерпретація
Скажімо, у вас є два алгоритми, f
і g
.
Омега
Припустимо , означає, що незалежно від вашого бюджету, немає постійної кількості обчислювальної потужності, яку ви можете додати до своєї системи, такої, яка f
завжди працюватиме так само швидко g
.
Великий о
Припустимо , означає, що якщо у вас є достатня кількість даних, f
завжди буде працювати швидше g
, незалежно від того, яку обчислювальну потужність ви додасте до вашої системи.
Доказ
Якщо ви справді намагаєтесь довести це, вам потрібно показати, використовуючи визначення нотації Ландау, що ваша функція відповідає необхідним умовам.
Так що вам потрібно знайти значення c
, d
, n_0
таким чином, що умова виконана.
Ось як це можна зробити для нижньої межі за допомогою c
:
Важливо усвідомити, що мене довільно визначати c
як менший, ніж a-1
це цілком добре. Визначення Тети (g) говорить про те, що "існує a c
". Це може бути будь-яке значення до тих пір, поки воно більше ніж 0. (Якщо a
це дійсне додатне дійсне число, вам доведеться трохи змінити доказ, тому що a - 1
насправді може бути негативним)
(Я вважаю a
позитивним, інакше функція завжди буде негативною для великих значень n
, що не має сенсу для функції, що позначає час виконання.)
Можна спробувати зробити це для верхньої межі, це досить схоже. Якщо ви не знаєте як, я можу надати вам підтвердження.
Підказка: почніть з d > a + 1
Увага
Важливо, щоб ви не доводили це неправильно. Якщо ви припускаєте, що (an + b) знаходиться в O (n) і їдете звідти, ви не довели, чого хотіли. Вам потрібно буде переконатися, що всі ваші кроки йдуть в обох напрямках, тобто замість =>
вас <=>
.