Для многих задач алгоритм с наилучшей асимптотической сложностью имеет очень большой постоянный коэффициент, который скрыт большими обозначениями O. Это происходит в матричном умножении, целочисленном умножении (в частности, недавнем алгоритме умножения целых чисел O (n log n) Харви и Ван-дер-Хувена), в сетях с малой глубиной сортировки и нахождении второстепенных графов. Такие алгоритмы иногда называют галактическими алгоритмами.
Обратите внимание, что для других алгоритмов, таких как общая сортировка и сложение целых чисел, известны алгоритмы с оптимальной асимптотической сложностью и небольшими постоянными коэффициентами.
Какие исследования были проведены при отделении первых алгоритмов от последних с теоретической точки зрения?
Мне известно, что скрытые константы часто опускаются, чтобы скрыть различия между различными моделями вычислений. Однако я уверен, что при большом разнообразии моделей эти галактические алгоритмы будут работать медленнее, чем асимптотически худшие алгоритмы, например, для входных данных размером один миллиард. Различие не является тонким, в некоторых случаях. Это было сделано строго?
Например, можно изобрести очень простую модель вычислений, такую как машина фон Неймана с очень простым ISA, а затем реализовать алгоритмы и связать их время выполнения с явными константами. Было ли это сделано для различных алгоритмов?
Ответы:
В аналитической комбинаторике одним из интересных мест, где к этому подходу интересно подходят некоторые классы алгоритмов и комбинаторные задачи . Описанный основной подход аналогичен тому, что вы предлагаете: вы начинаете с какой-то конкретной реализации алгоритма и идентифицируете некоторые повторяющиеся операции (обычно наиболее тяжелые), которые вы будете использовать, чтобы связать явно исчисляемую сложность для выполнения ввода заданного значения. размерN в виде числа CN что выбранная операция выполнена.
Методология не требует исправления какой-либо конкретной модели вычислений, хотя это может быть полезно, конечно. Также обратите внимание, что вы можете попытаться вычислить поведение наихудшего случая или ожидаемое поведение, или еще что-то еще.
Важнейшим компонентом этой методологии является анализ производящих функций этих значений. Иногда вы можете получить очень точные асимптотические приближения, используя методы комплексного анализа.
Простой пример, который рассматривается в книге, это быстрая сортировка. Это имеет квадратичное время выполнения в худшем случае, но на практике превосходит большинствоO(nlogn) алгоритмы. Делая точный анализ ожидаемой стоимости быстрой сортировки и сравнивая ее с сортировкой слиянием, вы видите, что ожидается, что она превзойдет последнюю с размером около 10, если я правильно помню. Чтобы иметь возможность вычислять такие вещи, вы, конечно, не можете игнорировать скрытые константы.
Фактически, в быстрой сортировке вы сортируете список путем рекурсивной сортировки подсписков, так что вы получите улучшение для всех размеров, если вы используете mergesort для списков, меньших, чем 10. Интересное примечание в книге упоминает, что в некоторой библиотеке Microsoft с открытым исходным кодом, универсальный алгоритм сортировки реализован как быстрая сортировка, пока вы не достигнете размера 10, после чего используется сортировка слиянием. В комментариях к коду упоминается, что тесты производительности показали, что это значение является оптимальным.
источник