Время работы алгоритма A не менее O (n2) - почему это бессмысленно?
Почему это заявление:
время работы алгоритма A по крайней мере O(n2)
бессмысленно ?
время работы алгоритма сортировки вставки не более O (n2)
это правильно?
Я попытался, но не смог получить хорошее объяснение.
У меня есть еще один вопрос:
Я знаю, что любая линейная функция a⋅n+b равна O(n), а также O (n2). Это также O (n3)?
10 ответов
T(n)
: время работы Algo A. Мы просто заботимся о верхней границе и нижней границе T(n)
Заявление: T(n) >= O(n^2)
верхняя граница: потому что T(n) >= O(n^2)
, тогда нет информации о верхней границе T(n)
Нижняя граница: предположим f(n) = O(n^2)
, потом заявление: T(n) >= f(n)
, а f(n)
может быть все, что "меньше", чем n^2
, Ex:constant, n,...
, поэтому нет никакого вывода о нижней границе T(n)
слишком
=> утверждение бессмысленно
одной из причин может быть то, что нижняя граница без верхней границы не очень полезна. "по крайней мере" означает, что в нормальном случае он может быть экспоненциальным. Если вы не знаете верхнюю границу, вы, вероятно, не можете использовать алгоритм в реальном приложении, потому что вы не можете знать, заканчивается ли программа до Вселенной.
Big O notation при правильном использовании указывает верхнюю границу. Таким образом, указание нижней границы как big O злоупотребляет обозначением.
Что сказал "бессмысленно" - это сильное слово. Это конечно полезная информация, даже если она не адекватная. С немного большим контекстом к вашему вопросу вы могли бы получить лучшую помощь.
O (n^2) является наихудшим сценарием, что означает, что время выполнения A будет n^2 или быстрее. Если его время выполнения по крайней мере O(n^2), то это означает, что самое быстрое время выполнения A может иметь, по крайней мере O(n^2). Это означает, что он также может быть медленнее, чем O(n^2). Эти утверждения означают, что A может иметь любое возможное время выполнения.
Я знаю, что любая линейная функция an+b равна O(n), а также O (n^2). Это также O (n^3) ?
Да, это так. Обозначение big-O обозначает целую коллекцию функций. Но мы должны использовать его, чтобы как можно точнее охарактеризовать функция. Хотя это правда, что f(n) = an+b
is O(n^2)
или даже O(n^3)
, точнее сказать, что f(n) = O(n)
.
o-обозначение, другими словами означает: F (x) принадлежит множеству O(g (x)), если f (x)
т. е. ваш алгоритм не растет более чем квадратичная функция
Это не бессмысленно, его можно использовать, например, если вы не знаете точного алгоритма, но вы наверняка знаете, что он потребует o(n^2) операций.
например, если кто-то не знает об алгоритмах сортировки, но понимает, что для сортировки массива нам нужно хотя бы посмотреть на каждый элемент, можно сказать, что "сортировка массива-это хотя бы O(n)".
потому что никто не заботится, как быстро он работает в лучшем случае, в худшем случае важно. Обычно людям интересно узнать, сколько это займет в худшем случае.
пусть f(n)
- время работы алгоритма.
=> f(n) >= O(n2)
=> f(n) >= 0 , because 0 is a member of set of functions that are O(n2)
это всегда верно для f(n)
, так как время работы всегда не отрицательно. Следовательно, утверждение избыточно.
аналогия:
утверждение немного похоже на высказывание: "крыша моего дома находится на высоте, которая, по крайней мере, на уровне земли.- Верно, но совершенно не информативно.
" время работы алгоритма A по крайней мере O(n2)" эквивалентно "время работы алгоритма A-большая Омега(n2)", поэтому это не бессмысленно.