2013-11-06 2 views
3

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

while(O(n^2)) { 
    O(n^4); 
    O(n^2); 
} 

Я оценил Выходов в соответствии с вложенными для-петли у меня есть в функциях. Мой вопрос в том, какова на самом деле временная сложность всего этого? Я бы тоже не просил короткого объяснения. Спасибо!

+0

Не могли бы вы прояснить одну вещь? Под 'while (O (n^2))' вы подразумеваете, что «цикл итерации n^2 раза» или «вычисление, хотим ли мы закончить цикл, принимает O (n^2)» и никоим образом не указывает число итераций ? –

+0

Параметр во время вызова функции. Это то же самое: 'function() {O (n^2); } 'и' while (function()) {O (n^4); O (N^2); } ' –

+0

Итак, тогда я обновлю свой ответ. –

ответ

2

EDIT: Мой предыдущий ответ был неправильным, потому что я допустил ошибку.

Теперь я понимаю, что ваш код может быть переработан в

while(run == true) 
{ 
    run = O(n^2); 
    O(n^4); 
    O(n^2); 
} 

поэтому каждая итерация имеет O (п^4) сложность, потому что мы имеем многочлен п^4 + 2 * (п^2) и мы бросаем более низкую степень. Теперь вам нужно умножить его на количество итераций. Например, если вы получите n итераций, вы получите O (n^5). Если у вас всегда есть 1000000000 итераций, у вас все еще есть O (n^4).

Отличным объяснение Big-O нотации здесь: What is a plain English explanation of "Big O" notation?

+0

Итак, хотя (O (n^2)) эквивалентно двум дополнительным вложенным петлям? Тогда я соглашусь, что это будет O (n^6). –

+0

Я ответил на это, но я удалил свой комментарий, потому что обнаружил недостаток в своей логике. Подождите, прежде чем принимать какой-либо ответ, хорошо?Я должен думать об этом. –

+0

Да. Это немного сложно. а сам должен быть O (n). Но в этом есть O (n^2). Это то, что беспокоит меня больше всего. –

1

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

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(v=vs.110).aspx

Также вы можете смотреть времена жить используя запись времени истечения секундомеров на этикетках и затем вызов me.update()

+0

В этом вопросе я не спрашиваю о времени в секундах, миллисекундах и т. Д. Однако у меня есть секундомеры. Я задаю вопрос о сложности времени алгоритма Big-O для всего цикла while. –

+0

А я вижу, извините. Основываясь на сложностях, которые вы заявили, я бы предположил, что это O (n^8). Я думаю об этом, потому что два члена внутри цикла while будут добавлять время вместе (и нижний член может быть опущен, оставляя вас с O (n^4)), но цикл затем потребует, чтобы это было выполнено O (n^2) и, следовательно, это умножило бы O ((O (n^4))^2) = O (n^8). Надеюсь, это полезно. – FraserOfSmeg

+0

Нет проблем. Так-то лучше. Но теперь у меня есть два ответа. Говорят, что O (n^6), и ваш с O (n^8). Это будет лучше для моего класса, это O (n^6), хе. Тем не менее, было бы неплохо улучшить код, поскольку текущая сложность слишком высока. –

Смежные вопросы