2015-11-10 3 views
4

Я пытаюсь найти временную сложность циклов while, и я понятия не имею, с чего начать. Я понимаю, как найти класс сложности для циклов, но когда дело доходит до циклов, я полностью теряюсь. Любые советы/советы о том, с чего начать?Какова временная сложность циклов while?

Вот пример задачи:

x = 0; 
A[n] = some array of length n; 
while (x != A[i]) { 
    i++; 
} 
+1

Что именно вы подразумеваете под «порядком while-loops»? – Paul

+0

Это эквивалентно циклу for, зациклируя индексную переменную '' 'i''' над массивом' '' A'''. Он имеет O (n). Имейте в виду, что обозначение Big-O обозначает наихудшее время, затраченное алгоритмом, и если нужный элемент находится в конце массива, вы будете выполнять цикл '' 'n''' раз, и цикл имеет постоянная стоимость. Следовательно, вы будете выполнять kn операции, для некоторой константы k; поэтому цикл равен O (n). –

+0

Ребята, это не плохой вопрос.Я видел, что ученики, которые новичок в этой технике, сталкиваются с этим сомнением, и я думаю, что это разумно, особенно для кого-то, кого выучили. – axiom

ответ

5

Когда вам нужно сделать что-то n раз, вы должны сделать это n раз. Вы можете использовать цикл for, цикл while или что-то еще, что предлагает ваш язык программирования (или псевдо-код!). Грубая, большая заметка о примечании о количестве работы, которую вы должны делать, и не заботится о том, как вы это делаете (несколько менее грубо, она комментирует, как объем работы, которая должна быть выполнена, растет с растущим вкладом).

Продолжайте читать детали.


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

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

Рассмотрим следующее:

1. Input n 
2. Do OperationX n times 

Обозначение машины Big O помогает комментируя сложность указанной выше операции. Это помогает во многих случаях. Например, он может помочь вам в сравнении выполнения операции над следующим:

1. Input n 
2. Input m 
3. Repeat m OperationX n times. 

Запись Big O будет сказать вам, что первая О (п), а второй является O (м * п) (при условии, что OperationX принимает постоянное время).

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

for(int i = 0; i < n; i++) { 
    operationX; 
} 

ли первая операция, и

i = j = 0; 
while(i < n) { 
    j = 0; 
    while(j < m) { 
     operationX; 
     j++; 
    } 
    i++; 
} 

второй. Большую нотацию O не волнует, было ли включено и выключено.


A[n] = some array of length n; 
for(x = 0;x != A[i];i++) { 

} 

Является for переписана вашего вопроса с той же сложностью (O(n)).

+0

Делает смысл. Теперь, в этом конкретном случае, правильно ли сказать, что цикл while имеет O (n), на основе того, что сказал @Eric выше? – alecjstew

+0

@AlecStewart В худшем случае вам может потребоваться пройти весь массив, и, следовательно, сложность действительно «O (n)». – axiom

+0

Ничего себе, это имеет смысл сейчас. На самом деле это намного проще, чем я думал. Спасибо за помощь! – alecjstew