Время работы алгоритма 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)", поэтому это не бессмысленно.