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


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: спасибо за предложения. К сожалению, я довольно плохо умею создавать красивые картинки - я думаю, что мои правки улучшили читаемость моих результатов.
Алекс тен Бринк

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