В реальных приложениях есть ли конкретное преимущество при использовании алгоритмов вместо O ( log ( n ) ) ?
Это тот случай, когда можно использовать, например, деревья Ван Эмде Боаса вместо более традиционных реализаций бинарного дерева поиска. Но, например, если мы возьмем то в лучшем случае двойной логарифмический алгоритм превосходит логарифмический (примерно) в 5 раз . А также в целом реализация более сложная и сложная.
Учитывая, что я лично предпочитаю BST, а не VEB-деревья, что вы думаете?
Можно легко продемонстрировать, что:
algorithms
complexity-theory
binary-trees
algorithm-analysis
search-trees
Гассен Хамруни
источник
источник
Ответы:
Не забывайте, что прежнему растет в геометрической прогрессии (в log ( n ) ) быстрее, чем log ( log n ) !журналN журнал( н ) журнал( журналн )
В самом деле, если вы посмотрите на отношения и log ( log ( n ) ) , не так уж много впечатляющего:журнал( н ) журнал( журнал( н ) )
[ источник ]
Но все равно вы получаете коэффициент от пяти до шести для размеров до . Обратите внимание, что на практике большие размеры не редкость, и ускорение по этому фактору просто потрясающе ! Это может иметь значение между результатами после обеда или только завтра. Имейте в виду, что часть ускорения может быть поглощена более высокими константами реализации дерева; Вы бы сюжет (или анализ) гр ⋅ журнал ( п ) и d ⋅ журнал ( журнал ( п ) ) с с , d фактическими постоянным временем выполнения , чтобы получить реальную картину.100000 c ⋅ log( н ) d⋅ журнал( журнал( н ) ) с , д
Кроме того, важно то, что упоминает Дейв: если таким образом выполняется ускоренная операция, скажем, линейно часто, постоянные ускорения становятся линейными ускорениями, то есть вы можете уменьшить ведущую постоянную всего вашего алгоритма! Как я уже говорил выше, это потрясающе. Просто посмотрите, что произойдет, если вы запустите операцию раз:N
[ источник ]
Теперь, если это не стоит проблем, я не знаю что.
источник
Можно предположить, что разница в сложности на самом деле не имеет большого значения, и что фактическое время выполнения более важно. Но если алгоритм лежит в основе другого алгоритма, то это различие может быть важным.
С чисто теоретической цели различие конечно имеет значение, особенно если алгоритм является частью другого. Это может поместить больший алгоритм в другой класс сложности.
источник
На самом деле я сам когда-то тестировал дерево Ван Эмде-Боаса. Я сравнил его с АА-деревом, хэш-картой и битовым массивом.
Тесты выполняют
size
вставки со случайными числами в интервале[0, bound]
, затем выполняютsize
поиск, затемsize
удаляют и затем снова выполняютsize
поиск. Удаление также выполняется по случайным числам, поэтому сначала нужно выяснить, находятся ли они в структуре вообще.Вот результаты (
size
= 2000000,bound
= 10000000) в секундах:Как видите, деревья Ван-Эмде-Боаса примерно в два раза медленнее хеш-карт, в десять раз медленнее битовых массивов и в 5 раз быстрее бинарных поисковых деревьев.
Конечно, для вышеизложенного необходим отказ от ответственности: тесты являются искусственными, вы можете улучшить код или использовать другой язык с компилятором, чей вывод будет быстрее, и так далее, и так далее.
Этот отказ от ответственности лежит в основе причины, по которой мы используем асимптотический анализ при разработке алгоритмов: поскольку вы понятия не имеете, что такое константы и как константы могут изменяться в зависимости от факторов среды, лучшее, что мы можем сделать, - это асимптотический анализ.
источник