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


33

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

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

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

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

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


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

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

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

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

Ответы:


39

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

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

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

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


Для меня ключевым моментом является то, что мы можем провести анализ наихудшего, наилучшего случая для любой из асимптотических ограниченных функций. Для меня это показывает независимость 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) бинарный поиск занимает не более шагов; (б) есть входные данные, которые на самом деле заставляют это много шагов. Поэтому, если - это время работы на входе в худшем случае для двоичного поиска, вы можете сказать, что .[log⁡n+1]T(n)T(n)=Θ(log⁡n)

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

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


1

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

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


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

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