2015-07-01 4 views
2

У меня возник вопрос о вычислении ожидаемого времени работы данной функции. Я прекрасно понимаю, как рассчитать фрагменты кода с циклами в них (для/while/if и т. Д.), Но функции без них кажутся мне немного странными. Например, предположим, что мы имеем следующий фрагмент кода:Расчет ожидаемого времени работы функции

public void Add(T item) 
{ 
    var newArr = new T[this.arr.Length + 1]; 
    Array.Copy(this.arr, newArr, this.arr.Length); 
    newArr[newArr.Length - 1] = item; 
    this.arr = newArr; 
} 

Если моя логика работает правильно, функция Add имеет сложность O (1), потому что в лучшем/худшем/средний случае это будет просто читать каждую строку кода один раз, правильно?

ответ

0

Вы всегда должны учитывать временную сложность вызовов функций. Я не знаю, как реализовано Array.Copy, но я собираюсь догадаться, что это O(N), что делает всю функцию AddO(N). Разумеется, ваша интуиция правильная, но отдыхает. Фактически это O(1).

+0

Спасибо! Теперь это имеет смысл. :) – Calihog

0

Если у вас есть несколько суба-операция с О (п) + O (журнал (п)) и т.д., и дорогостоящий шагом является стоимостью всей операции - по умолчанию большого O относится к худшему случаю , Здесь, как и скопировать массив, это О (п) операции

+0

Спасибо за объяснение! – Calihog

0

Сложность вычисляется Вслед за этим 2 правила:

-Calling метод (сложность + 1)

-Encountering следующие ключевые слова: если, в то время как, повторяю, для, & &, ||, поймать, случай и т.д ... (сложности + 1)

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

+0

Спасибо за ваше объяснение, это очень помогло! Так что, если мне нужно Array.Copy 2 раза нравится: – Calihog

+0

Так что если мне нужно Array.Copy 2 раза нравится: Array.Copy (this.arr, newArr, index); Array.Copy (this.arr, index + 1, newArr, index, this.arr.Length - index - 1); -> это означает, что второй Array.Copy будет O (2n), и функция будет снова O (n)? – Calihog

+0

Да, это будет O (n). – Kibadachi

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