2010-09-30 1 views
2

У меня есть NSMutableArray, который я просматриваю в виде таблицы. Проблема в том, что когда я добавляю объекты в этот массив, я не хочу иметь дубликаты.Предотвращение дублирования копий в виде таблицы

Если я создаю NSMutableSet из NSMutableArray, добавьте объекты в NSMutableSet, а затем верните его в NSMutableArray, это более эффективно, чем проверка NSMutableArray через цикл для дубликатов перед добавлением элемента?

ответ

4

Обычно да, было бы более эффективно использовать набор. Построение набора из n элементов - O(n log n). Поиск всех дубликатов в массиве путем простого цикла будет O(n^2). (Если вы действительно намерены вы могли бы получить O (N журнал N), но вы должны были бы своего рода переписать то, что набор уже делает.)

+0

Но как дубликаты найдены в комплекте? Является ли цикл внутренним? –

+0

Набор представлен внутренне как двоичные деревья поиска. Чтобы добавить элемент, он находит подходящее место, перемещая дерево (операция O (log n).) Если он уже существует, ничего не вставлено (объект не создан), иначе он вставляет его. – JoshD

+0

Однако, мой исходный источник данных не является набором. Это массив, потому что он отображается в виде таблицы. При преобразовании массива в набор перед вставкой будут некоторые накладные расходы. Затем набор должен быть преобразован обратно в массив для отображения. Это все еще эффективно? –

1

вы можете проверить, если объект вашего добавления существует с помощью

- (NSUInteger)indexOfObject:(id)anObject 

если объект существует в массиве, это даст вам индекс иначе он возвращает

NSNotFound 

так что вы можете сделать, если перед добавлением элементов в массив.

Я думаю, что это немного лучше в памяти мудро, потому что вы не создаете объекты.

Надеюсь, это поможет

+0

В итоге это будет O (n^2), чтобы создать массив из n элементов. Это вариант, но он не намного эффективнее, чем цикл через массив. – JoshD

+0

Да, я согласен с тем, что создание набора более эффективно, но в результате ему нужен NSMutableArray и создание набора, создающего из него NSMutableArray, потребляет больше памяти, поскольку вам приходится делать объекты. – mklfarha