Сложность алгоритма, реализующего метод Ньютона для нахождения квадратного корня

Я написал программу на Java для вычисления квадратного корня из заданного пользователем числа с использованием метода Ньютона. Основные операции алгоритма выглядят так:

answer = guess - ((guess * guess - inputNumber) / (2 * guess)); 
while (Math.abs(answer * answer - inputNumber) > leniency) {
    guess = answer;
    answer = guess - ((guess * guess - inputNumber) / (2 * guess));
}

Теперь я пытаюсь найти сложность алгоритма (да, это домашнее задание) и прочитал здесь, что временная сложность метода Ньютона равна O(log(n) * F(x)).

Однако из приведенного выше фрагмента кода я интерпретировал временную сложность как:

O(1+ ∑(1 to n) (1) ) = O(1+n) = O(n)

Не уверен, что я здесь ошибаюсь, но я не могу понять несоответствие в больших ОС даже после прочтения объяснения вики.

Кроме того, я предполагаю, что «сложность алгоритма» является синонимом «временной сложности». Правильно ли это сделать?

Был бы очень признателен за помощь в объяснении этого парадокса, так как я новичок с несколькими программными модулями «нажми и работай».

Заранее спасибо :)


person levicorpus    schedule 04.11.2012    source источник
comment
Для все больших и больших чисел количество итераций, необходимых для приближения к ответу в пределах leniency, увеличивается, но нелинейно.   -  person Wug    schedule 04.11.2012
comment
@Wug спасибо за ваши идеи. я предполагаю, что сложность итераций со снисходительностью равна логарифму (снисходительности), как и в ответе jpalecek? Пожалуйста, поправьте меня, если я ошибаюсь. я все еще не совсем понимаю концепцию O (log (n) * F (x)). может ли кто-нибудь просветить меня о «общей картине» и F (x)? Извините, я немного медленно, но я действительно хочу понять. заранее спасибо   -  person levicorpus    schedule 05.11.2012


Ответы (1)


Проблема в том, что вы на самом деле ничего не знаете о n в своих расчетах — вы не говорите, каким оно должно быть. Когда вы вычислите фактическую ошибку следующей итерации алгоритма (сделайте это!), вы увидите, что, например. если a равно как минимум 1, а ошибка меньше 1, вы фактически удваиваете количество допустимых мест на каждой итерации. Итак, чтобы получить p знаков после запятой, нужно выполнить log(p) итераций.

person jpalecek    schedule 04.11.2012
comment
привет jpalecek, спасибо за ваш ответ :) я попытался вычислить фактические ошибки, и действительно кажется, что когда ошибка меньше 1, количество значащих цифр каждый раз удваивается. ваша точка зрения о итерациях log (p) для p знаков после запятой: будет ли правильно сказать, что, поскольку пространство поиска уменьшается вдвое на каждой итерации, сложность относительно p, таким образом, равна log (p)? - person levicorpus; 05.11.2012
comment
@levicorpus: я бы так не сказал. Я не уверен, каким будет пространство поиска в этом случае, и если мы возьмем, что между, например, 2^p интервалами. 1 и 2, которые могут аппроксимировать число с точностью до p бит, и мы ищем ответ среди них, на самом деле это будет означать, что алгоритм на самом деле работает намного лучше, чем просто вдвое уменьшая пространство поиска на каждом шаге. - person jpalecek; 09.11.2012