Как O и Ω относятся к худшему и лучшему случаям?


33

Сегодня в лекции мы обсудили очень простой алгоритм поиска элемента в отсортированном массиве с использованием бинарного поиска . Нас попросили определить его асимптотическую сложность для массива из элементов.n

Моя идея заключалась в том, что это явно или чтобы быть более конкретным, потому что - это число операций в худшем случае. Но я могу сделать лучше, например, если я впервые нажал на элемент поиска - тогда нижняя граница равна .O(logn)O(log2n)log2nΩ(1)

Лектор представил решение как поскольку мы обычно рассматриваем только наихудшие входные данные для алгоритмов.Θ(logn)

Но при рассмотрении только наихудших случаев, какой смысл иметь обозначения O и Ω когда все наихудшие случаи данной проблемы имеют одинаковую сложность ( Θ это все, что нам нужно, верно?).

Что мне здесь не хватает?


@Smaji: Что вы подразумеваете под «Но при рассмотрении только наихудших случаев, какой смысл иметь большие обозначения O и Omega, когда все наихудшие случаи имеют + - одинаковую сложность (Тета - это все, что нам нужно, верно?)». пожалуйста, уточните это.
Танмой

@Smajl: Я думаю, что ваш вопрос: зачем нужны обозначения Big O и Big Omega при анализе алгоритмов? я прав?
Танмой

5
O(log2n) не более конкретно, чем , они обозначают один и тот же класс функций. O(logn)
Рафаэль

log2(n) - это то же самое, что поэтому 2 просто указывает на фактор, который можно удалить (как и другие факторы в big-O.log(b)/log(2)×logb(n)
ctrl-alt-delor

Ответы:


39

Обозначения Ландау обозначают асимптотические оценки функций . Смотрите здесь для объяснения различий между , и .OΩΘ

Время наихудшего, наилучшего, среднего или «назови это случай» описывает различные функции времени выполнения: одну для последовательности наибольшего времени выполнения любого заданного , одну для последовательности самого низкого и т. Д. И т. Д.n

По сути, эти два не имеют ничего общего друг с другом. Определения являются независимыми. Теперь мы можем сформулировать асимптотические границы для функций времени выполнения: верхний ( ), нижний ( ) или оба ( ). Мы можем сделать либо для худшего, лучшего или любого другого случая.Ω ΘOΩΘ

Например, в бинарном поиске мы получаем асимптотику времени выполнения в наилучшем случае и асимптотику в худшем случае .Θ ( журнал n )Θ(1)Θ(logn)


Для меня ключевым моментом является то, что мы можем провести анализ наихудшего, наилучшего случая для любой из асимптотических ограниченных функций. Для меня это показывает независимость Big O от анализа наихудшего случая. Благодарность!
Патрик

1
@ Патрик Не совсем. Во-первых, вы решаете, хотите ли вы проанализировать худший, средний или лучший случай. Затем вы придумаете функцию стоимости (или как можно более хорошее приближение). Только тогда вы принимаете асимптотику, если вообще.
Рафаэль

17

Рассмотрим следующий алгоритм (или процедуру, или фрагмент кода, или что-то еще):

Contrive(n)
1. if n = 0 then do something Theta(n^3)
2. else if n is even then
3.    flip a coin
4.    if heads, do something Theta(n)
5.    else if tails, do something Theta(n^2)
6. else if n is odd then
7.    flip a coin
8.    if heads, do something Theta(n^4)
9.    else if tails, do something Theta(n^5)

Каково асимптотическое поведение этой функции?

В лучшем случае (где чётно), время выполнения равно и , но не чего-либо.Ω ( n ) O ( n 2 ) ΘnΩ(n)O(n2)Θ

В худшем случае (где нечетно), время выполнения равно и , но не чего-либо.Ω ( n 4 ) O ( n 5 ) ΘnΩ(n4)O(n5)Θ

В случае время выполнения равно .Θ ( n 3 )n=0Θ(n3)

Это немного надуманный пример, но только в целях наглядной демонстрации различий между границей и делом. Вы могли бы различие стать значимыми с полностью детерминированными процедурами, если деятельность вы выполняете не имеет никакой известной границ.Θ


1
Чтобы сделать это детерминированным, разбейте по случая. nmod4
vonbrand

4

Не обязательно. В этом случае, а именно бинарный поиск в отсортированном массиве, вы можете видеть, что: (a) бинарный поиск занимает не более шагов; (б) есть входные данные, которые на самом деле заставляют это много шагов. Поэтому, если - это время работы на входе в худшем случае для двоичного поиска, вы можете сказать, что .[logn+1]T(n)T(n)=Θ(logn)

С другой стороны, для других алгоритмов вы не сможете точно вычислить , и в этом случае у вас может быть разрыв между верхней и нижней границами времени выполнения на входе в худшем случае.T(n)

Теперь, для поиска в отсортированном массиве, верно еще кое-что: любой алгоритм поиска отсортированного массива должен проверять . Однако для такого рода нижней границы вам необходимо проанализировать саму проблему. (Вот идея: в любое время, алгоритм поиска не исключает некоторое множество позиций , где элемент он ищет может быть тщательно проработан вход может затем гарантировать , что. есть уменьшается не более чем в раза .)[logn+1]S[n]|S|2


1

Вы правы, многие люди небрежно используют когда они должны использовать . Например, аналитик алгоритма может в итоге получить временную функцию и сразу сделать вывод, что , что технически верно , но более резкое утверждение было бы . Я приписываю это забывчивое поведение двум причинам. Во-первых, многие считают более популярным и приемлемым, возможно, из-за его долгой истории. Напомним, что он был введен более века назад, тогда как (и ) были введены только в 1976 году (Дональд Кнут). Во-вторых, это может быть потому, чтоOΘT(n)=n2+n+2T(n)=O(n2)T(n)=Θ(n2)OΘΩOлегко доступно на клавиатуре, тогда как нет!Θ

С технической точки зрения, однако, главная причина, по которой осторожные аналитики предпочитают использовать над заключается в том, что первое охватывает «большую территорию», чем второе. Если мы возьмем ваш пример бинарного поиска и захотим использовать , нам нужно будет сделать два утверждения: \ одно для лучшего случая, а именно , и другое для худшего случая, а именно . С помощью мы делаем только одно утверждение, а именно . Математически функции, охватываемые , также покрываются , тогда как обратное не всегда верно.OΘΘΘ(1)Θ(logn)OO(logn)ΘO


Добро пожаловать, и спасибо, что нашли время, чтобы опубликовать ответ! Однако я не могу сказать, в чем ваша точка зрения. В первом абзаце вы предлагаете некоторые предположения. Во втором случае вы предлагаете точку зрения, которая сама по себе является «небрежной»: высказывание «это усредненный случай» ничего не говорит о лучшем случае, за исключением того, что он в том же классе. Говоря «это средний случай»), подразумевается та же верхняя граница! Если вы хотите предоставить дополнительную информацию о лучшем случае, вам придется явно указать ее в любом случае. Следовательно, я не понимаю, как вы можете использовать O над O. O(logn)Θ(logn)
Рафаэль

@ Рафаэль Я отсылаю вас к определениям двух обозначений. Кроме того, осознайте, что они используются для классификации асимптотической «скорости роста» времени выполнения, а не самого времени выполнения, как это указано в ваших различных ответах и ​​комментариях.
Хамед Нассар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.