Я встречал некоторый код, который определенно мог бы быть улучшен, но меня интересует нотация Big-O моих улучшений.
Их оригинальный код добавляет элемент в массив, и каждый разон делает это, он создает новый массив из n + 1 и копирует старый, например, так:
public MyType GetNewType()
{
MyType[] tempTypes = new MyType[_types.Count + 1];
_types.CopyTo(tempTypes, 0);
_types = tempTypes;
_types[types.Count - 1] = new MyType();
return _types[types.Count - 1];
}
Насколько я понимаю, это будет операция O (n).Поэтому я переписал его следующим образом:
private int _currentIndex; //initialized in the constructor
public MyType GetNewType()
{
if (_types.Length == _currentIndex)
{
MyType[] tempTypes = new MyType[_types.Length + 10];
_types.CopyTo(tempTypes, 0);
_types = tempTypes;
}
_types[_currentIndex] = new MyType();
_currentIndex++;
return _types[_currentIndex - 1];
}
Будет ли результат этих изменений означать, что функция теперь будет работать в O (n / 10), поскольку для нее потребуется только операция копирования каждые 10 вызовов?Или это не так хорошо работает?