Логарифмическая или двойная логарифмическая сложность времени

9

В реальных приложениях есть ли конкретное преимущество при использовании алгоритмов вместо O ( log ( n ) ) ?О(журнал(журнал(N))O(log(n))

Это тот случай, когда можно использовать, например, деревья Ван Эмде Боаса вместо более традиционных реализаций бинарного дерева поиска. Но, например, если мы возьмем то в лучшем случае двойной логарифмический алгоритм превосходит логарифмический (примерно) в 5 раз . А также в целом реализация более сложная и сложная.n<1065

Учитывая, что я лично предпочитаю BST, а не VEB-деревья, что вы думаете?

Можно легко продемонстрировать, что:

n<106. lognlog(log(n))<5,26146

Гассен Хамруни
источник
в основном вы должны смотреть на константы, включенные в алгоритм для меньшего значения / размера ввода. В идеале мы хотели бы, чтобы они были маленькими.
singhsumit
3
Обратите внимание, что с VEB-деревьев произошел ряд улучшений, количество в структурах данных в ОЗУ со сложностью поиска / вставки / удаления без рандомизации (детерминистская) и O ( О(Lог Lог N)с рандомизации. СмДетерминированная сортировка по O (плоглогп)Время и линейное пространство. Хан и О (О(Lог Lог N)О(N Lог Lог N)Ожидаемое время и линейное пространство. О(Lог Lог N)Хан и Торуп.
AT
В реальном мире коэффициент 5 довольно значительный, и количество предметов часто может быть 10 ^ 9 или даже 10 ^ 12.
RBarryYoung

Ответы:

10

Не забывайте, что прежнему растет в геометрической прогрессии (в log ( n ) ) быстрее, чем log ( log n ) !журналNжурнал(N)журнал(журналN)

В самом деле, если вы посмотрите на отношения и log ( log ( n ) ) , не так уж много впечатляющего:журнал(N)журнал(журнал(N))

журнал (п) / журнал (журнал (п))
[ источник ]

Но все равно вы получаете коэффициент от пяти до шести для размеров до . Обратите внимание, что на практике большие размеры не редкость, и ускорение по этому фактору просто потрясающе ! Это может иметь значение между результатами после обеда или только завтра. Имейте в виду, что часть ускорения может быть поглощена более высокими константами реализации дерева; Вы бы сюжет (или анализ) гр журнал ( п ) и d журнал ( журнал ( п ) ) с с , d фактическими постоянным временем выполнения , чтобы получить реальную картину.100000сжурнал(N)dжурнал(журнал(N))с,d

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

п * журнала (п) / (N * журнала (журнал (п)))
[ источник ]

Теперь, если это не стоит проблем, я не знаю что.

Рафаэль
источник
6

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

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

Дэйв Кларк
источник
6

На самом деле я сам когда-то тестировал дерево Ван Эмде-Боаса. Я сравнил его с АА-деревом, хэш-картой и битовым массивом.

Тесты выполняют sizeвставки со случайными числами в интервале [0, bound], затем выполняют sizeпоиск, затем sizeудаляют и затем снова выполняют sizeпоиск. Удаление также выполняется по случайным числам, поэтому сначала нужно выяснить, находятся ли они в структуре вообще.

Вот результаты ( size= 2000000, bound= 10000000) в секундах:

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

Как видите, деревья Ван-Эмде-Боаса примерно в два раза медленнее хеш-карт, в десять раз медленнее битовых массивов и в 5 раз быстрее бинарных поисковых деревьев.

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

Этот отказ от ответственности лежит в основе причины, по которой мы используем асимптотический анализ при разработке алгоритмов: поскольку вы понятия не имеете, что такое константы и как константы могут изменяться в зависимости от факторов среды, лучшее, что мы можем сделать, - это асимптотический анализ.

журналNжурналжурналN232журнал232знак равно32журнал32знак равно5

Алекс тен Бринк
источник
Может быть, перейти в R (или эквивалент) и получить несколько симпатичных графиков (как это сделал @Raphael).
Дэйв Кларк,
1
журналNжурналжурналN
@DaveClarke: спасибо за предложения. К сожалению, я довольно плохо умею создавать красивые картинки - я думаю, что мои правки улучшили читаемость моих результатов.
Алекс тен Бринк
Вероятно, недостаточно данных для правильной картинки. Неважно .... но научиться делать хорошие снимки это удобный навык.
Дейв Кларк,