Пытаясь понять Big-о нотации - PullRequest
3 голосов
/ 11 мая 2011

Привет, я был бы очень признателен за помощь в обозначении Big-O.Завтра у меня экзамен, и хотя я могу определить, что такое f (x), это O (g (x)), но не могу сказать, что полностью его понимаю.

Следующий вопрос ВСЕГДА поднимается на экзамене, и мне действительно нужно попытаться выяснить это, первая часть кажется легкой (я думаю). Вы просто выбираете значение для n, вычисляете их все на клакулятореи привести их в порядок?Это кажется легким, хотя, поэтому я не уверен.Мне очень трудно найти примеры в Интернете.

Каков правильный порядок сложностей O (n2), O (log2 n), O (1), O (2n), O (n!), O(n log2 n)?

Какова вычислительная сложность алгоритма бинарного поиска в худшем случае для упорядоченного списка длиной n = 2k?

Ответы [ 6 ]

3 голосов
/ 11 мая 2011

Этот парень должен помочь тебе .

От низшего к высшему, что такое правильный порядок сложностей O (n2), O (log2 n), O (1), O (2n), O (n!), O (n log2 n)?

Порядок такой же, как если бы вы сравнивали их предел на бесконечности. как lim(a/b), если это 1, то они одинаковы, инф. или 0 означает, что один из них быстрее.

Какой наихудший случай вычислительная сложность двоичного Алгоритм поиска по упорядоченному списку длина n = 2k?

  1. Найти бинарный поиск лучший / худший Big-O.
  2. Поиск доступа к связанному списку по индексу лучший / худший Big-O.
  3. Сделайте выводы.
2 голосов
/ 12 мая 2011

Привет.Нотацию Big-O сложно понять, если вы не понимаете, что означает « n ».Вы уже видели, как люди говорят о том, как O ( n ) == O ( 2n ), поэтому я попытаюсь объяснить, почему это так.

Когда мы описываем алгоритм как имеющий «порядок- n сложность пространства», мы имеем в виду, что размер пространства хранения, используемого алгоритмом, увеличивается с линейной зависимостью от размера проблемы, над которой он работает(именуемый n .) Если у нас есть алгоритм, который, скажем, отсортировал массив, и для выполнения этой операции сортировки самое большое, что мы сделали в памяти, - это создание точной копии этого массива., мы бы сказали, что он имеет «порядок- n сложность пространства», потому что по мере увеличения размера массива (назовите его n элементов) алгоритм будет занимать больше места вчтобы соответствовать входу массива.Следовательно, алгоритм использует пространство «O ( n )» в памяти.

Почему O ( 2n ) = O ( n )?Потому что когда мы говорим в терминах O ( n ), мы обращаем внимание только на поведение алгоритма, поскольку n становится настолько большим, насколько это возможно.Если бы n должен был стать бесконечным, алгоритм O ( 2n ) занял бы два бесконечных пространства памяти, а алгоритм O ( n ) взял быодин раз бесконечность пространства памяти.Поскольку бесконечность в два раза - это просто бесконечность, считается, что оба алгоритма занимают достаточно одинаковое количество места, чтобы оба они назывались алгоритмами O ( n ).

Возможно, вы подумаетесебя "Алгоритм, который занимает вдвое больше места, чем другой алгоритм, все еще относительно неэффективен. Почему они упоминаются с использованием одной и той же записи, когда она намного эффективнее?"Потому что при увеличении эффективности для сколь угодно большого n при переходе от O ( 2n ) к O ( n ) абсолютно меньше выигрыша в эффективности для сколь угодно большого n при переходе от O ( n ^ 2 ) к O ( 500n ).Когда n равно 10, n ^ 2 равно 10 раз 10 или 100, а 500n равно 500 раз 10 или 5000. Но нас интересует n при n становится максимально возможным.Они пересекаются и становятся равными для n из 500, но еще раз, мы даже не заинтересованы в n , равном 500. Когда n равно 1000, n ^ 2 - это один МИЛЛИОН, а 500n - это "простой" полмиллиона.Когда n равен одному миллиону, n ^ 2 составляет одну тысячу миллиардов - 1 000 000 000 000 - в то время как 500n с трепетом смотрит на простоту пятисот миллионов- 500 000 000 - баллы сложности.И еще раз, мы можем продолжать увеличивать n , потому что при использовании логики O ( n ) нас интересует только максимально возможная n .

(Вы можете утверждать, что когда n достигает бесконечности, n ^ 2 - это бесконечность, умноженная на бесконечность, тогда как 500n - это пятьсот раз бесконечность, иРазве вы не сказали, что когда-то бесконечность - это бесконечность? Это на самом деле не работает для бесконечности, бесконечность. Я думаю. Просто нет. Может ли математик поддержать меня?)

Этодает нам странный, нелогичный результат, где O ( 7550 млрд. каджиллионов n ) считается улучшением O ( n * log n ).Из-за того, что мы работаем со сколь угодно большим « n », все, что имеет значение, это сколько раз и где в O () появляется n .Эмпирические правила, упомянутые в посте Джулии Хейворд, помогут вам, но вот некоторая дополнительная информация, чтобы помочь вам.

Во-первых, потому что n становится максимально большим, O ( n ^ 2 + 61n + 1682 ) = O ( n ^ 2 ), потому что n ^2 вносит гораздо больше, чем 61n , так как n становится произвольно большим, что 61n просто игнорируется, а 61n термин уже доминирует над термином 1682 .Если вы видите сложение внутри O (), позаботьтесь о n с наивысшей степенью.

Two, O ( log10n ) = O ( log (любое число) n ), потому что для любой базы b , log10 ( x ) = log_ b (* х *) / log_ б * +1138 * (10).Следовательно, O ( log10n ) = O ( log_b (x) * 1 / (log_b (10) ). Эта цифра 1 / log_b (10) является константой, которую мымы уже показали выпадение из O ( n ).

1 голос
/ 11 мая 2011

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

Таким образом, O (2n) и O (n) одинаковы - они изменяются только на постоянный коэффициент (2).Один из способов думать об этом - просто отбросить константы, так как они не влияют на сложность.

Другая проблема с выбором n и использованием калькулятора состоит в том, что он даст вам неправильный ответ для определенного n,Большое О - это мера того, как быстро что-то растет с ростом n, но при любом n сложность может быть не в правильном порядке.Например, при n = 2 n ^ 2 равно 4 и n!2, но n!растет немного быстрее, чем n ^ 2.

Важно понять это правильно, потому что для времени выполнения с несколькими членами вы можете отбросить меньшие члены - то есть, если O (f (n))3n ^ 2 + 2n + 5, вы можете отбросить 5 (постоянную), отбросить 2n (3n ^ 2 растет быстрее), затем сбросить 3 (постоянный коэффициент), чтобы получить O (n ^ 2) ... но если выне знаю, что n ^ 2 больше, вы не получите правильный ответ.

На практике вы можете просто знать, что n линейно, log (n) растет медленнее, чем линейно, n ^a> n ^ b, если a> b, 2 ^ n быстрее любого n ^ a и n!даже быстрее, чем это.(Подсказка: старайтесь избегать алгоритмов, которые имеют n в показателе степени, и особенно избегайте алгоритмов, которые являются n!.)

Что касается второй части вашего вопроса, что происходит с бинарным поиском в худшем случае?На каждом шаге вы сокращаете пространство пополам, пока в конце концов не найдете свой предмет (или не хватит места для поиска).Это log2 (2k).Поиск, при котором вы просто просматриваете список, чтобы найти свой элемент, будет состоять из n шагов.И мы знаем из первой части, что O (log (n))

Удачи на экзамене!

0 голосов
/ 12 мая 2011

См. это и ищите решения здесь, это первое.

enter image description here

0 голосов
/ 11 мая 2011

В понятных терминах нотация Big-O определяет, как быстро растет конкретная функция. Хотя он имеет свои корни в чистой математике, его наиболее популярное применение - это анализ алгоритмов, которые можно анализировать на основе размера ввода, чтобы определить приблизительное число операций, которые должны быть выполнены.

Преимущество использования нотации состоит в том, что вы можете классифицировать темпы роста функций по их сложности. Многие различные функции (на самом деле бесконечное число) могут быть выражены с одинаковой сложностью с помощью этой записи. Например, n+5, 2*n и 4*n + 1/n имеют сложность O(n), потому что функция g(n)=n , проще всего, , представляет рост этих функций.

Я делаю акцент на , проще всего , потому что основное внимание в нотации уделяется доминирующему члену функции. Например, O(2*n + 5) = O(2*n) = O(n), потому что n является доминирующим термином в росте. Это связано с тем, что в обозначении предполагается, что n стремится к бесконечности, что приводит к тому, что оставшиеся члены играют меньшую роль в скорости роста. И, по соглашению, любые константы или мультипликативы опущены.

Чтение Большие обозначения O и Сложность времени для более подробного обзора.

0 голосов
/ 11 мая 2011

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

Если определение неясно, более интуитивное описание состоит в том, что «более высокий порядок» означает «растет быстрее, чем при росте n».Некоторые практические правила:

  • O (n ^ a) - более высокий порядок, чем O (n ^ b), если a> b.
  • log (n) растет медленнее, чем любая положительная сила n
  • exp (n) растет быстрее, чем любая сила n
  • n!растет быстрее, чем exp (kn)

О, а что касается сложности, игнорируйте постоянные множители.

Этого достаточно, чтобы вывести, что правильный порядок равен O (1), O (log n), O (2n) = O (n), O (n log n), O (n ^ 2), O (n!)

...