Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Смысл O-нотации


Помогите разобраться с O-нотацией. Насколько я понял:


O(h(n)) означает, что алгоритм ведет себя в наихудшем случает как c*h(n), начиная с какой-то величины n0, где c — константа.
Ω(h(n)) означает, что алгоритм ведет себя в наилучшем случае как
c*h(n), начиная с какой-то величины n0, где c — константа.
ο(h(n)) означает, что алгоритм ведет себя в наихудшем случае
«асимптотически лучше», чем c*h(n), начиная с какой-то величины n0, где c — константа.
ω(h(n)) означает, что алгоритм ведет себя в наилучшем случае
«асимптотически хуже», чем c*h(n), начиная с какой-то величины n0, где c — константа.


Не могу понять что означает Θ(h(n)), поясните пожалуйста. И если я ошибся в предыдущих определениях, поправьте пожалуйста.
    


Ответы

Ответ 1



Смотрите. Пусть f(n) — количество шагов алгоритма. Сложность O(h(n)) означает, что алгоритм требует количества шагов, не большего, чем h(n), умноженное на какую-то константу. То есть, lim f(n)/h(n) при растущем n конечен. Так вот, говорят, что f(n) = Θ(h(n)), если f(n) = O(h(n)) и одновременно h(n) = O(f(n)). Это значит, что функции f(n) и h(n) имеют как бы одинаковый порядок роста. Пример: если настоящая сложность алгоритма f(n) = 2n^2 + 30n + log(n^4), то f(n = O(n^2), т. к. 2n^2 + 30n + log(n^4) / n^2 = 2 + 30/n + 4 log n/n^2 -> 2 при бесконечно растущем n. Но одновременно f(n) = O(n^100). Действительно, 2n^2 + 30n + log(n^4) / n^100 = 2/n^9 + 30/n^99 + 4 log n/n^100 -> 0 при бесконечно растущем n. Видите? То есть, O(h(n)) есть как бы лишь верхняя оценка сложности алгоритма, как угодно грубая. Далее: f(n) = Θ(n^2). Действительно, f(n) / h(n) -> 2 (как мы уже выясняли), а h(n) / f(n) очевидно стремится к 0.5. С другой стороны, f(n) ≠ Θ(n^100), потому что n^100 / (2n^2 + 30n + log(n^4)) = n^9 * (n^2) / (2n^2 + 30n + log(n^4)) = n^98 * (1 / (2 + 30/n + 4 log n / n)), а этот предел расходится, т. к. знаменатель ограничен, а n^98 стремится к бесконечности. Таким образом, Θ является более точной оценкой сложности алгоритма. Примечание для математиков-пуристов: да, предел не обязательно существует, строго говоря, нужен lim sup.

Комментариев нет:

Отправить комментарий