Почему итерация через NSArray происходит быстрее, чем итерация через NSSet?


Мне было интересно, почему итерация через NSArray быстрее, чем итерация через NSSet? Я предполагаю, что это как-то связано с тем, что NSArray заказан, в то время как NSSet нет, но я получил сертифицированный ответ вместо того, чтобы просто гадать.

Правка:

Мой вопрос был: почему это быстрее, что не объясняется в этой теме. и не тогда, когда он быстрее.

2 4

2 ответа:

Первое: вы не можете сказать, что NSArray быстрее, чем NSSet. Как вы получаете от ссылки в комментариях, это зависит от того, что вы делаете. Поиск объекта в экземпляре NSSet намного быстрее. И это то, что вы хотите сделать, когда вы выбираете NSSet.

Существует два различия между множествами и массивами.

    Массивы должны сохранять порядок, а множества-нет. Наборы должны заботиться об уникальности, массивы-нет.

Так, кажется, и есть умно, чтобы иметь совершенно разные реализации для обоих. Это может привести к различному поведению среды выполнения. Поэтому правильный вопрос будет: где сюрприз?

Очевидно, что дополнительное условие для множеств стоит дороже, чем дополнительное условие для массивов.

Кстати: невозможно для экземпляра NSSet, выполнить обещание об уникальности, которое он дает. Это происходит потому, что уникальность проверяется только при вставке объекта в набор. Когда вы меняете объект после вставив его, он может стать равным другому объекту в наборе.

Ответ @ Amin не точен в некоторых аспектах.

  1. мы говорим о итерации, а не о поиске.
  2. поиск в Set, конечно, быстрее, чем поиск в Array, так как первый занимает толькоO(1) Время, в то время как второй занимаетO(n) Время.
  3. на мой взгляд, NSArray быстрее, чем NSSet(итерация), потому что время доступа NSArray точно равно O(1), хотя NSSet тоже O(1), но оно амортизируется.
  4. вы даже не можете вставить объект в NSSet

Можете ли вы объяснить немного больше о "очевидно, что дополнительное условие для наборов дороже, чем дополнительное условие для массивов."