n * log n и n / log n от времени полинома


14

Я понимаю, что быстрее, чем и медленнее, чем . Мне трудно понять, как на самом деле сравнить и с где .Θ ( n log n ) Θ ( n / log n ) Θ ( n log n ) Θ ( n / log n ) Θ ( n f ) 0 < f < 1Θ(n)Θ(nlogn)Θ(n/logn)Θ(nlogn)Θ(n/logn)Θ(nf)0<f<1

Например, как мы решаем против илиΘ ( п 2 / 3 ) Θ ( п 1 / 3 )Θ(n/logn)Θ(n2/3)Θ(n1/3)

Я хотел бы иметь некоторые направления в таких случаях. Спасибо.

Ответы:


3

Если вы просто нарисуете пару графиков, вы будете в хорошей форме. Wolfram Alpha - отличный ресурс для таких исследований:

уравнения

график

Сгенерировано по этой ссылке . Обратите внимание, что на графике log (x) - это натуральный логарифм, поэтому уравнение одного графика выглядит немного забавно.



Помимо согласия с Рафаэлем, эта картина дала бы намного лучшую идею , выбор еще большего диапазона позволяет второй функции исчезнуть, что может сбить с толку.
phant0m

9

2 n 2 n n k k log n n k klogn является обратным к . Так же, как растет быстрее, чем любой многочлен независимо от того, насколько велика конечная , будет расти медленнее, чем любые функции многочлена независимо от того, насколько мал ненулевой положительный .2n2nnkklognnkk

n k k < 1 n / log n n / n 1 - kn/logn против , поскольку совпадает с: противnkk<1n/lognn/n1k

как для больших , для и больших .n n / log n > n k k < 1 nn1k>lognnn/logn>nkk<1n


3

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

Сказав это, если мы только рассмотрим супер-большие размеры данных, т.е. который в конечном итоге выигрывает, то O(n^f)быстрее, чем O(n/log n)для 0 < f < 1.

Большая часть алгоритмической сложности состоит в том, чтобы определить, какой алгоритм в конечном итоге быстрее, поэтому достаточно знать, что O(n^f)он быстрее, чем O(n/log n)для 0 < f < 1.

Общее правило заключается в том, что умножение (или деление) на в log nконечном итоге будет незначительным по сравнению с умножением (или делением) n^fна любое f > 0.

Чтобы показать это более наглядно, давайте рассмотрим, что происходит при увеличении n.

   n       n / log n         n^(1/2)
   2        n/ 1              ?
   4        n/ 2             n/ 2
   8        n/ 3              ?
  16        n/ 4             n/ 4
  64        n/ 6             n/ 8
 256        n/ 8             n/16
1024        n/10             n/32

Обратите внимание, что уменьшается быстрее? Это n^fколонна.

Даже если значение fбыло ближе к 1, n^fстолбец будет начинаться медленнее, но при увеличении n вдвое скорость изменения знаменателя возрастает, тогда как знаменатель n/log nстолбца изменяется с постоянной скоростью.

Давайте нарисуем частный случай на графике

введите описание изображения здесь введите описание изображения здесь

Источник: Вольфрам Альфа

Я выбрал O(n^k)такой, который kдовольно близко к 1 (в 0.9). Я также выбрал константы, чтобы изначально O(n^k)медленнее. Тем не менее, обратите внимание, что в конечном итоге он "выигрывает" в конце и занимает меньше времени, чем O(n/log n).


как насчет n / log n

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

3

Просто подумайте о как о . Так что для вашего примера . Тогда легко сравнить ростнnfnn1fn2/3=n/n1/3

nlognvs.nn1f.

Помните, что растет асимптотически медленнее, чем любой , для каждого .n ε ε > 0lognnεε>0


1

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

В вашем случае подумайте о n = 10 ^ 10 и a = .5

O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)

Следовательно, O (n ^ a) быстрее, чем O (n / logn), когда 0 <a <1, я использовал только одно значение, однако вы можете использовать несколько значений для построения интуиции о функции


1
Не пишите O(10^9), но главное в попытках использовать числа для построения интуиции - это правильно.

Провал. Это не правильно. Вы подставили одну постоянную n, которая может быть смещена. Если бы я выбрал разные константы, я мог бы заставить любой алгоритм выглядеть лучше. Обозначение Big O используется для определения тенденций того, что будет быстрее в долгосрочной перспективе. Чтобы сделать это, вы должны показать, что он быстрее для больших n, даже если он медленнее, когда n меньше.

Благодарю. Добавлена ​​часть с несколькими значениями и для рассмотрения больших чисел

Следует отметить, что только потому, что f (a)> g (a) для некоторой константы a, не обязательно означает, что O (f (x))> O (g (x)). Это полезно для построения интуиции, но недостаточно для составления строгого доказательства. Чтобы показать, что это соотношение выполняется, вы должны показать, что это верно для ВСЕХ больших n, а не только для одного большого n. Точно так же вы должны показать, что это верно для всех многочленов положительной степени <1.

1

Пусть обозначает «f растет асимптотически медленнее, чем g», тогда вы можете использовать следующее простое правило для полилогарифмического? функции:fg

nα1(logn)α2(loglogn)α3nβ1(logn)β2(loglogn)β3(α1,α2,α3)<(β1,β2,β3)

Порядок отношений между кортежами лексикографический. Т.е. и(2,10)<(3,5)(2,10)>(2,5)

Применительно к вашему примеру:

O(n/logn)(1,1,0)

O(n2/3)(2/3,0,0)

O(n1/3)(1/3,0,0)

(1/3,0,0)<(2/3,0,0)<(1,1,0)O(n1/3)O(n2/3)O(n/logn)

Вы могли бы сказать: полномочия n доминируют над полномочиями журнала, которые доминируют над полномочиями журнала.

Источник: Конкретная математика, с. 441

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.