Big O алгоритма, который опирается на конвергенцию

Мне интересно, можно ли выразить временную сложность алгоритма, который опирается на конвергенцию с использованием записи Big O.

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

В случае алгоритма, который имеет некоторые критерии сходимости (где мы повторяем операцию до тех пор, пока определенная метрика ошибки не будет ниже порога, или скорость изменения метрики ошибки ниже некоторого порога), как мы можем измерить временную сложность? Количество итераций, необходимых для схождения и выхода из этого цикла, кажется трудным объяснить, поскольку способ сходимости алгоритма имеет тенденцию зависеть от содержимого ввода, а не от его размера.

Как мы можем представить временную сложность алгоритма, который полагается на сходимость в нотации Big O?

Ответ 1

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

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

do {
  // some operation with time complexity O(N)
} while (errorMetric > 0.01) // if this is false, we've reached convergence

Как правило, мы пытаемся определить что-то об алгоритмическом способе конвергенции - обычно, определяя, что его функция чего-то.

Например, мы могли бы показать, что алгоритм измерения ошибки является функцией числа итераций, так что ошибка = 1/2 ^ i, где я - число итераций.

Это можно переписать в терминах количества итераций: iterations = log (1/E), где E - желаемое значение ошибки.

Поэтому, если у нас есть алгоритм, который выполняет некоторую линейную операцию на каждой итерации цикла сходимости (как в примере выше), можно предположить, что наша временная сложность равна O (N * log (1/E)). Наша функциональная скорость роста зависит от количества ошибок, которые мы готовы терпеть, в дополнение к размеру ввода.

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

Возьмем, к примеру, PageRank, в его вычислении используется алгоритм, называемый степенной итерацией, который является алгоритмом, который аппроксимирует доминирующий собственный вектор матрицы. Кажется возможным, что скорость сходимости может быть показана как функция первых двух собственных значений (показана в ссылке).

Ответ 2

Асимптотические обозначения не зависят от сходимости.

Согласно книге CLRS (Введение в Алгоритмы третьего издания, глава 3, стр. 43):

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

Вы упомянули, что ваш код (или идея) имеет бесконечный цикл и продолжает удовлетворять условию, и вы назвали его удовлетворяющим условию сходимости, но в этом смысле конвергенция не связана с асимптотическими обозначениями, такими как big O, потому что она должна завершиться, потому что необходимо условие код, который должен быть алгоритмом, состоит в том, что его итерации должны заканчиваться. Вы должны убедиться, что итерации вашего кода закончены, поэтому вы можете рассказать об этом алгоритме и можете его асимптотически проанализировать.

Другое дело, что это правда, может быть, когда-нибудь результат будет иметь больше времени работы, а у другого меньше времени на запуск. Это не об асимптотическом анализе. Это лучший случай, худший случай. Мы можем показать анализ алгоритмов в лучшем случае или в худшем случае big O или другими асимптотическими обозначениями. Самый надежный из них - это анализ вашего алгоритма в худшем случае. Наконец, для анализа вашего кода вы должны точно описать шаг своего алгоритма.

Ответ 3

С математической точки зрения основной проблемой является оценка скорости конвергенции используемого подхода. Я не так хорошо знаком с численными методами, чтобы свободно говорить о более чем 1 Измерения (матрицы и тензоры, которые вы, вероятно, больше интересуете). Но ley принимает другой пример решения уравнения, чем бисекция, уже оцененный выше как O(log(1/e)).

Рассмотрим метод Ньютона и предположим, что мы пытаемся найти один корень с точностью e = 10e-8 для всех чисел с плавающей запятой. Мы имеем квадрат как скорость сходимости, поэтому мы имеем приблизительно 2 * log (float_range/e) итерации цикла, что означает то же, что и алгоритмическая сложность Bisection O(log(range/accuracy)), если мы можем вычислить производную для постоянное время.

Надеюсь, этот пример имеет смысл для вас.