Алгоритмическая сложность операций с NSMutableArray

180
15 декабря 2016, 16:03

Как ответить на следующих вопрос? Он будет на собеседовании на работу

Опишите алгоритмическую сложность следующих операций для NSMutableArray в среднем и в худшем случаях:

  1. вставка нового элемента в начало структуры;
  2. вставка нового элемента в конец структуры;
  3. поиск существующего элемента по значению;
  4. поиск существующего элемента по индексу;
  5. удаление существующего элемента.

Какую структуру данных вы бы использовали для реализации NSMutableArray с учётом ваших требований к алгоритмической сложности?

Answer 1

В оффициальной документации подобного нет (в явном виде), что и следовало ожидать.

Но почитав детально, стает понятно, что ничего нового изобрести в Эппл не могли, и скорее всего там следующее.

а) вставка нового элемента в начало структуры;

в этом случае нужно выделить место под новый элемент, скопировать все элементы, сдвинув индексы на 1 и вставить новый элемент. Перемещение элементов имеет сложность O(n). Выделение памяти обычно константное, если размеры небольшие. При больших размерах (десятках и сотнях мегабайт) сложность нужно рассматривать отдельно. Поэтому, на небольших объемах массива вставка нового элемента в начало - это O(n). На большом размере массива нужно смотреть в менеджер памяти.

б) вставка нового элемента в конец структуры;

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

в) поиск существующего элемента по значению;

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

г) поиск существующего элемента по индексу;

здесь обычно, если ничего не постарались сделать, то сложность константная, O(1), потому что просто нужно умножить индекс на размер элемента и приплюсовать начало массива.

д) удаление существующего элемента.

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

READ ALSO
Статический класс qt

Статический класс qt

Создаю класс, в нем есть 2 метода и статические свойства для хранения данныхЗадача: имеется 2 класса, один из них изменяет значения статического...

206
Как построить график любой функции?

Как построить график любой функции?

Данная математическая функция(любая), программа должна сама решить её и построить его графикКак решить подобную задачу

198
Шестнадцатеричные числа в Си

Шестнадцатеричные числа в Си

Передо мной стоит задача реализовать алгоритм SEAL20

164
Создание формы на основе main.cpp в Qt Creator

Создание формы на основе main.cpp в Qt Creator

Есть код в maincpp, который описывает форму программы

192