Время вычисления T (n) и Big-O с бесконечным циклом

#big-o #infinite-loop

#большой o #бесконечный цикл

Вопрос:

Я запутался в том, как создать функцию T (n) для измерения времени вычисления для вложенного бесконечного цикла. Вот код:

 x=1;
for(int i = 0;i<n-1;i  ){
     for(int j = 1; j<=x; j  ){
        cout << j << endl;
        x*=2;
     }
}
  

Таким образом, внутренний цикл будет продолжаться вечно, и я застрял, пытаясь создать функцию для представления ее вычислительного времени. Я написал, что его время вычисления равно T (n) = [Суммирование i = 0 до (n-2)] (2 ^ j). 2^j представляет значение x с текущим значением j из внутреннего цикла. Обсудив это с моими коллегами, мы определенно согласны с тем, что время вычисления, безусловно, не зависит от значения n. Мы также могли бы полностью переосмыслить это, поскольку цикл бесконечен, и просто нет способа выразить его вычислительное время. Любая помощь очень ценится.

Комментарии:

1. Я в полном замешательстве. Вам нужно время выполнения бесконечного цикла? Это бесконечно. Кстати, внешний цикл не имеет значения, поскольку внутренний цикл никогда не завершается. Кроме того, на практике это, вероятно, не бесконечно, поскольку x в конечном итоге завершится, если это целочисленный тип.

2. Временная сложность имеет смысл только для алгоритмов, которые завершаются.

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

Ответ №1:

Сложность алгоритма определяется только для алгоритмов, которые по (наиболее часто принимаемому) определению должны завершаться. Этот процесс не завершается (за исключением «на практике», как отмечает Марсело; т. Е. Как программа на реальной машине против теоретически на теоретической машине Тьюринга с бесконечной лентой и все время в мире), так что это не алгоритм. Таким образом, у него нет «алгоритмической временной сложности».

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

Ответ №2:

Сложность большого O действительно бесконечного цикла не определена. Вот почему:

Определение для обозначения Big O гласит, что:

f(N) = O(g(N)) тогда и только тогда, когда f(n) <= |M g(n)| для некоторой константы M и для всех n >= n0

Однако обязательным условием является то, что f(n) и g(n) являются вещественнозначными функциями.

В случае бесконечного цикла гипотетическое значение времени, необходимого для завершения цикла, бесконечно. Таким образом, функция f(n) не будет сопоставляться N с действительным числом. Следовательно, f(N) не является вещественнозначной функцией, и мы не можем применить стандартное определение Big O таким образом, чтобы оно имело математический смысл.

(Страница Википедии в обозначении Big O содержит определение более формально, но результат тот же.)


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

(Однако мне не нравится это объяснение, поскольку оно основывается на конкретном определении термина «алгоритм». В вопросе фактически не используется этот термин.)

Ответ №3:

Ну, в реальном мире вы не получите ответа по очевидным причинам, но в математике… почему бы и нет.

Я запишу уравнение времени функции:

 T(n) = n-1 * T(X) 
  

T(X) — это время для внутреннего цикла. Я потрачу его: X1 = начальное значение x (в данном случае 1 )

 T(X) = T(X1 * 2)   1 = T(X1 * 4)   2 = ... = T(X1 * 2^j)   j
  

Конечным условием этого цикла является when j >= X1 * 2^j 1 , поэтому мы хотим решить:

 j >= X1 * 2^j -> j = 2^j -> j <= log2(j).
  

Приведенное выше уравнение не имеет решения в этом диапазоне набора натуральных чисел, но в наборе целых чисел оно легко решается с помощью -1 (фактически любого целого числа, меньшего 0 ).).

Таким образом, временная сложность для T(n) была бы (n-1) * (-1) = 1 - n .

Я не знаю, что в этом полезного, но я надеюсь, что это поможет вам.

Комментарии:

1. Боже, нет! Логарифм, как правило, не определяется для любого аргумента, меньшего или равного 0 .

2. Log не определен в 0, но, на мой взгляд, вы также не можете определить временную сложность бесконечного цикла.

3. Ну, тогда вы должны написать именно это, а не писать математически неправильный ответ! Это особенно противоречит вашему первому абзацу: но в математике… почему бы и нет . Лучшим ответом было бы T(n) = inf , потому что это, конечно, не вызовет путаницы в работе.

4. Я не согласен. OP задал вопрос, который явно нерегулярен. Итак, я предполагаю, что нерегулярный подход принесет пользу проблеме. Это похоже на проблему с sqrt (n), где n<0. Вы не сможете определить это, если немного не измените правила (добавив набор комплексных чисел). Определение log2(n) для n<0 так же логично, как и вопрос «когда заканчивается бесконечность?». Вам придется немного изменить правила, чтобы ответить на него.

5.Я не против расширения математики. Но в математике все, что вы добавляете к нему, должно быть согласовано (правильно) со всеми вещами, которые там уже были. Из вашего определения это не следует, поскольку это приводит к противоречию — учитывая, что 2^x строго увеличивается R , мы получаем 0.5 = 2^-1 <= 2^log_2(-1) = -1 . Следовательно, это не является (действительным) математическим доказательством. Кроме того, временная сложность никогда не < 0 , что противоречит вашему результату. Кроме того, у нас есть инвариант: временная сложность всегда >= является пространственной сложностью ( Theta(1) здесь), что опять же неверно для вашего результата.