Что именно представляет собой большое обозначение?

Я действительно запутался в различиях между большой О, большой Омегой и большой тета-нотой.

Я понимаю, что большая O - верхняя граница, а большая Омега - нижняя граница, но что представляет собой большая Ө (тета)?

Я читал, что это означает ограниченную привязку, но что это значит?

Ответ 1

Это означает, что в данной функции алгоритм является большим-O и большим-Omega.

Например, если это Ө(n), то существует некоторая константа k, так что ваша функция (время выполнения, что угодно) больше n*k для достаточно больших n, а некоторые другие constant k, так что ваша функция меньше n*k для достаточно больших n.

Другими словами, при достаточно больших n он зажат между двумя линейными функциями:

Для k < K и n достаточно больших, n*k < f(n) < n*K

Ответ 2

Сначала дайте понять, что такое большая O, большая Theta и большая Omega. Все они устанавливают функции.

Big O дает верхнюю асимптотическую границу, а большая Омега дает нижнюю границу. Большая тэта дает оба.

Все, что есть Ө(f(n)), также O(f(n)), но не наоборот. T(n) называется Ө(f(n)), если он находится как в O(f(n)), так и в Omega(f(n)).
В терминах терминов Ө(f(n)) находится intersection O(f(n)) и Omega(f(n))

Например, худший вариант сортировки слияния - это O(n*log(n)) и Omega(n*log(n)) - и, следовательно, также Ө(n*log(n)), но он также O(n^2), так как n^2 асимптотически "больше", чем он. Однако он не Ө(n^2), так как алгоритм не Omega(n^2).

Немного более глубокое математическое объяснение

O(n) является асимптотической верхней границей. Если T(n) O(f(n)), это означает, что из некоторого n0 существует константа C такая, что T(n) <= C * f(n). С другой стороны, большая Омега говорит, что существует константа C2 такая, что T(n) >= C2 * f(n))).

Не путайте!

Не путать с худшим, лучшим и средним анализом случаев: все три (Omega, O, Theta) нотации не связаны с лучшим, худшим и средним случаем анализа алгоритмов. Каждый из них может быть применен к каждому анализу.

Мы обычно используем его для анализа сложности алгоритмов (например, пример сортировки слияния). Когда мы говорим, что "Алгоритм A есть O(f(n))", мы действительно имеем в виду: "Сложность алгоритмов при худшем случае 1 - это O(f(n))" - значение - оно масштабируется "аналогично" (или формально, не хуже) функции f(n).

Почему мы заботимся об асимптотической оценке алгоритма?

Ну, есть много причин для этого, но я считаю, что наиболее важными из них являются:

  • Гораздо сложнее определить точную функцию сложности, поэтому мы "скомпрометируем" на обозначениях большой O/big-Theta, которые достаточно информативны теоретически.
  • Точное количество операционных систем также зависит от платформы. Например, если у нас есть вектор (список) из 16 чисел. Сколько операций потребуется? Ответ: это зависит. Некоторые процессоры допускают векторные дополнения, в то время как другие - нет, поэтому ответ различается между различными реализациями и разными машинами, что является нежелательным свойством. Однако нотация большого О, однако, намного более постоянна между машинами и реализациями.

Чтобы продемонстрировать эту проблему, просмотрите следующие графики: enter image description here

Ясно, что f(n) = 2*n "хуже", чем f(n) = n. Но разница не такая резкая, как от другой функции. Мы можем видеть, что f(n)=logn быстро становится намного ниже других функций, а f(n) = n^2 быстро становится намного выше, чем другие. Итак, из-за вышеприведенных причин мы "игнорируем" постоянные факторы (2 * в примере графов) и принимаем только обозначение большого О.

В приведенном выше примере f(n)=n, f(n)=2*n будет находиться в O(n) и в Omega(n) - и, следовательно, также будет находиться в Theta(n). С другой стороны - f(n)=logn будет в O(n) (он "лучше", чем f(n)=n), но НЕ будет в Omega(n) - и, следовательно, также НЕ будет в Theta(n).
Симметрично, f(n)=n^2 будет в Omega(n), но НЕ в O(n), и, следовательно, - также NOT Theta(n).


1 Обычно, хотя и не всегда. когда класс анализа (худший, средний и лучший) отсутствует, мы действительно имеем в виду худший случай.

Ответ 3

Чтобы ответить на ваш вопрос, необходимо также объяснить асимптотические обозначения и функции в асимптотических обозначениях. Если у вас есть терпение, чтобы прочитать все это, все будет очень ясно в конце.

1. Асимптотическое обозначение

Чтобы подумать об алгоритмах, вы можете использовать две основные идеи:

  • Определите, сколько времени алгоритм берет в терминах ввода.
  • Фокусируйтесь на том, как быстро функция растет с размером ввода; как скорость роста времени работы. Пример: предположим, что алгоритм, работающий на входе размера n, принимает машинные инструкции 6n ^ 2 + 100n + 300. Член 6n ^ 2 становится больше остальных членов, 100 n + 300, как только n становится достаточно большим, 20 в этом случае. введите описание изображения здесь

Мы говорим, что время работы этого алгоритма растет с ростом n ^ 2, снижая коэффициент 6 и остальные члены 100n + 300. На самом деле не имеет значения, какие коэффициенты мы используем; пока время работы равно ^ 2 + bn + c, для некоторых чисел a > 0, b и c всегда будет значение n, для которого an ^ 2 больше bn + c, и эта разница увеличивается с ростом n. Отбрасывая постоянные коэффициенты и менее значимые члены, мы используем асимптотические обозначения.

2. Big-Theta​​h2 >

Вот простая реализация линейного поиска

var doLinearSearch = function(array) {
  for (var guess = 0; guess < array.length; guess++) {
    if (array[guess] === targetValue) { 
        return guess;  // found it!
    }
  }
  return -1;  // didn't find it
};
  • Каждый из этих небольших вычислений принимает постоянное количество времени каждый раз, когда он выполняется. Если for-loop повторяется n раз, то время для всех n итераций является c1 * n, где c 1 - сумма времен для вычислений в одной итерации цикла. Этот код имеет немного дополнительных накладных расходов, для настройки цикла for (включая инициализацию до 0) и, возможно, возврата -1 в конце. Позвольте называть время для этой накладной c 2, которая также является константой. Поэтому общее время для линейного поиска в худшем случае - c 1 * n + c 2.
  • постоянный множитель c 1 и младший член c 2 не говорят нам о скорости роста времени работы. Важно то, что наихудшее время работы линейного поиска растет, как размер массива n. Обозначения, которые мы используем для этого времени работы, - это Θ (n). Это греческое письмо "тета", и мы говорим "большая-тэта n" или просто "Theta of n."
  • Когда мы говорим, что конкретное время работы Θ (n), мы говорим, что когда n становится достаточно большим, время работы не менее k 1 * n и не более k 2 * N для некоторых констант k 1 и k 2. Здесь, как думать о Θ (n) введите описание изображения здесь

  • При малых значениях n нам все равно, как время работы сравнивается с k 1 * n или k 2 * n. Но как только n становится достаточно большим - справа или справа от пунктирной линии - время работы должно быть зажато между k 1 * n и k 2 * n. Пока существуют эти константы k 1 и k 2, мы говорим, что время работы Θ (n).

  • Когда мы используем большие обозначения, мы говорим, что мы имеем асимптотически ограниченную привязку на время работы. "Асимптотически", потому что это имеет значение только для больших значений n. "Плотная привязка" , потому что мы забивали время работы с постоянным коэффициентом выше и ниже.

3. Функции в асимптотических обозначениях

  • Предположим, что алгоритм занимал постоянный промежуток времени, независимо от размера ввода. Например, если вам задан массив, который уже отсортирован в возрастающий порядок, и вам нужно найти минимальный элемент, это займет постоянное время, так как минимальный элемент должен быть в индексе 0. Так как нам нравится использовать функцию n в асимптотической нотации можно сказать, что этот алгоритм работает в Θ (n ^ 0) времени. Зачем? Поскольку n ^ 0 = 1, а время работы алгоритма находится в пределах некоторого постоянного множителя 1. На практике мы не пишем Θ (n ^ 0); мы пишем Θ (1)
  • Вот список функций в асимптотической нотации, которые мы часто встречаем при анализе алгоритмов, которые перечислены от самого медленного до самого быстрого роста. Этот список не является исчерпывающим; существует множество алгоритмов, время работы которых здесь не отображается:
  • Θ (1) (aka постоянный поиск)
  • Θ (lg n) (aka двоичный поиск)
  • Θ (n) (aka linear search)
  • Θ (n * lg n)
  • Θ (п ^ 2)
  • Θ (n ^ 2 * lg n)
  • Θ (п ^ 3)
  • Θ (2 ^ п)

  • Заметим, что экспоненциальная функция a ^ n, где a > 1, растет быстрее любой полиномиальной функции n ^ b, где b - любая константа.

4. Знак Big-O

  • Мы используем большие обозначения для асимптотически связанного роста времени работы с постоянными факторами выше и ниже. Иногда мы хотим привязываться только выше. Было бы удобно иметь форму асимптотической нотации, которая означает "время работы растет не более того, но оно может расти медленнее". Для таких случаев мы используем нотацию "большой-O".
  • Если время работы O (f (n)), то при достаточно большом n время работы не более k * f (n) для некоторой константы k. Здесь, как думать о времени выполнения, которое является O (f (n)): введите описание изображения здесь
  • Если вы вернетесь к определению многозначной нотации, вы заметите, что он очень похож на ноту большой O, за исключением того, что примечание большого размера ограничивает работу как сверху, так и снизу, а не только от выше. Если мы скажем, что время работы Θ (f (n)) в конкретной ситуации, то оно также O (f (n)). Например, мы можем сказать, что из-за наихудшего времени работы бинарного поиска есть Θ (lg n), это также O (lg n). Обратное не обязательно верно: как мы видели, мы можем сказать, что бинарный поиск всегда выполняется в O (lg n), но не в том, что он всегда работает в Θ (lg n) времени.
  • Предположим, у вас в кармане 10 долларов. Вы подходите к своему другу и говорите: "У меня в кармане денег, и я гарантирую, что это не более миллиона долларов". Ваше утверждение абсолютно верно, хотя и не очень точно. Один миллион долларов - верхняя граница на 10 долларов, так же как O (n) является верхней границей времени выполнения двоичного поиска.
  • Другими, неточными верхними границами бинарного поиска будут O (n ^ 2), O (n ^ 3) и O (2 ^ n). Но ни одно из Θ (n), Θ (n ^ 2), Θ (n ^ 3) и Θ (2 ^ n) не будет корректно описывать время работы бинарного поиска в любом случае.

пять. Обозначение Big-Ω (Big-Omega)

  • Иногда мы хотим сказать, что алгоритм занимает как минимум определенное количество времени, не предоставляя верхней границы. Мы используем обозначение большой Ω; что греческое письмо "омега".
  • Если время работы Ω (f (n)), то при достаточно большом n время работы не меньше k * f (n) для некоторой константы k. Здесь, как думать о времени работы, которое является Ω (f (n)): введите описание изображения здесь
  • Мы говорим, что время работы "большое-Ω функции f (n)". Мы используем обозначение большой Ω для асимптотических нижних границ, так как оно ограничивает рост времени работы снизу при достаточно больших входных размерах.
  • Так же, как Θ (f (n)) автоматически влечет O (f (n)), он также автоматически влечет Ω (f (n)). Таким образом, мы можем сказать, что наихудший период работы двоичного поиска равен Ω (lg n). Мы можем также делать правильные, но неточные выражения с использованием обозначения большой Ω. Например, точно так же, как если бы у вас действительно был миллион долларов в кармане, вы можете честно сказать: "У меня есть деньги в кармане, а это как минимум 10 долларов", вы также можете сказать, что в худшем случае время двоичного поиска равно Ω (1), так как оно принимает по крайней мере постоянное время.

Ссылка: https://www.khanacademy.org

Ответ 4

Theta (n): Функция f(n) принадлежит Theta(g(n)), если существуют положительные константы c1 и c2 такие, что f(n) может быть зажата между c1(g(n)) и c2(g(n)). то есть он дает как верхнюю, так и нижнюю границу.

Theta (g (n)) = {f (n): существуют положительные константы c1, c2 и n1 такие, что                 0 <= c1 (g (n)) <= f (n) <= c2 (g (n)) для всех n >= n1}

когда мы говорим f(n)=c2(g(n)) или f(n)=c1(g(n)), он представляет асимптотически жесткую границу.

O (n): Он дает только верхнюю границу (может или не может быть жесткой)

O (g (n)) = {f (n): существуют положительные константы c и n1 такие, что 0 <= f (n) <= cg (n) для всех n >= n1}

ex: граница 2*(n^2) = O(n^2) асимптотически плотная, тогда как оценка 2*n = O(n^2) не является асимптотически плотной.

o (n): Он дает только верхнюю границу (никогда не ограниченную)

заметная разница между O (n) и o (n) равна f (n) меньше cg (n) для всех n >= n1, но не равно, как в O (n).

ex: 2*n = O(n^2), но 2*(n^2) != o(n^2)