Почему итерация через NSArray происходит быстрее, чем итерация через NSSet?
Мне было интересно, почему итерация через NSArray быстрее, чем итерация через NSSet? Я предполагаю, что это как-то связано с тем, что NSArray заказан, в то время как NSSet нет, но я получил сертифицированный ответ вместо того, чтобы просто гадать.
Правка:
Мой вопрос был: почему это быстрее, что не объясняется в этой теме. и не тогда, когда он быстрее.
2 ответа:
Первое: вы не можете сказать, что
NSArray
быстрее, чемNSSet
. Как вы получаете от ссылки в комментариях, это зависит от того, что вы делаете. Поиск объекта в экземпляреNSSet
намного быстрее. И это то, что вы хотите сделать, когда вы выбираетеNSSet
.Существует два различия между множествами и массивами.
Массивы должны сохранять порядок, а множества-нет. Наборы должны заботиться об уникальности, массивы-нет.
Так, кажется, и есть умно, чтобы иметь совершенно разные реализации для обоих. Это может привести к различному поведению среды выполнения. Поэтому правильный вопрос будет: где сюрприз?
Очевидно, что дополнительное условие для множеств стоит дороже, чем дополнительное условие для массивов.Кстати: невозможно для экземпляра
NSSet
, выполнить обещание об уникальности, которое он дает. Это происходит потому, что уникальность проверяется только при вставке объекта в набор. Когда вы меняете объект после вставив его, он может стать равным другому объекту в наборе.
Ответ @ Amin не точен в некоторых аспектах.
- мы говорим о итерации, а не о поиске.
- поиск в
Set
, конечно, быстрее, чем поиск вArray
, так как первый занимает толькоO(1) Время, в то время как второй занимаетO(n) Время.- на мой взгляд,
NSArray
быстрее, чемNSSet
(итерация), потому что время доступаNSArray
точно равно O(1), хотяNSSet
тоже O(1), но оно амортизируется.- вы даже не можете вставить объект в
NSSet
Можете ли вы объяснить немного больше о "очевидно, что дополнительное условие для наборов дороже, чем дополнительное условие для массивов."