Разница между массивом, множеством и словарем в Swift

Я новичок в Swift Lang, видел много уроков, но не ясно - мой вопрос, в чем главное отличие Array, Set а также Dictionary тип коллекции?

4 ответа

Решение

Вот практические различия между различными типами:

Массивы являются эффективно упорядоченными списками и используются для хранения списков информации в тех случаях, когда порядок важен.

Например, сообщения в приложении социальной сети, отображаемые в tableView, могут храниться в массиве.

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

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

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

Например, вы можете хранить список элементов и ссылки на дополнительную информацию об этих элементах в словаре.

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

(Для получения дополнительной информации и поиска собственных определений Apple ознакомьтесь с руководствами Apple по адресу https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html).

Подробную документацию можно найти здесь, в руководстве Apple. Ниже приведены несколько быстрых определений:

массив

Массив хранит значения того же типа в упорядоченном списке. Одно и то же значение может появляться в массиве несколько раз в разных позициях.

Задавать

Набор хранит различные значения одного и того же типа в коллекции без определенного порядка. Вы можете использовать набор вместо массива, когда порядок элементов не важен или когда вам нужно убедиться, что элемент появляется только один раз.

толковый словарь

В словаре хранятся ассоциации между ключами одного типа и значениями одного и того же типа в коллекции без определенного порядка. Каждое значение связано с уникальным ключом, который действует как идентификатор для этого значения в словаре. В отличие от элементов в массиве, элементы в словаре не имеют определенного порядка. Вы используете словарь, когда вам нужно искать значения на основе их идентификатора, во многом так же, как в реальном словаре используется для поиска определения для конкретного слова.

Старый поток еще стоит поговорить о производительности.

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

Массивы

Доступ к случайному элементу будет стоить вам столько же, сколько и доступ к первому или последнему, поскольку элементы следуют последовательно друг за другом, поэтому к ним осуществляется прямой доступ. Они будут стоить вам 1 цикл.

Вставка элемента является дорогостоящей. Если вы добавите в начало, это будет стоить вам 1 цикл. Вставляя в середину, остаток нужно сместить. В худшем случае это может стоить столько же, сколько N циклов (в среднем N/2 циклов). Если вы добавите в конец и у вас будет достаточно места в массиве, это будет стоить вам 1 цикл. В противном случае будет скопирован весь массив, что обойдется вам в N цикл. Вот почему так важно выделить достаточно места для массива в начале операции.

Удаление с начала или до конца обойдется вам 1. С середины смены требуется операция. В среднем это N/2.

Поиск элемента с данным свойством обойдется вам в N/2 цикл.

Так что будьте очень осторожны с огромными массивами.

Словари

Хотя словари не работают, они могут принести вам некоторые преимущества. Поскольку ключи хешируются и хранятся в хеш-таблице, любая операция обойдется вам в 1 цикл. Единственным исключением может быть нахождение элемента с заданным свойством. В худшем случае это может стоить вам цикла N/2. Однако при умном дизайне вы можете назначать значения свойств в качестве ключей словаря, поэтому поиск обойдется вам всего в 1 цикл независимо от того, сколько элементов находится внутри.

Коллекции Swift — массив, словарь, набор

Каждая коллекция является динамической, поэтому у нее есть дополнительные шаги для расширения и свертывания. Массив должен выделять больше памяти и копировать старую дату в новую, Словарь дополнительно должен пересчитывать индексы корзины для каждого объекта внутри

(O) обозначение описывает выполнение некоторой функции

Array — ArrayList — динамический массив объектов. Он основан на обычном массиве. Используется для задачи, где вам очень часто нужно иметь доступ по индексу

      get by index - O(1)
find element - O(n) - you try to find the latest element
insert/delete - O(n) - every time a tail of array is copied/pasted

Словарь - HashTable, HashMap - сохранение пар ключ/значение. Он содержит ведра/корзины (структура массива, доступ по индексу), где каждая из них содержит другую структуру (список массивов, связанный список, дерево). Столкновения решаются . Основная идея:

  1. рассчитать хэш -код ключа [О программе] ( ) и на основе этого хеш-кода вычисляется индекс ведра (например, с помощью модуля (mod)).
  2. Поскольку функция Hashable возвращает он не может гарантировать, что два разных объекта будут иметь разные хеш-коды. При этом пересчет корзины не равен Int.max. Когда у нас есть два разных объекта с одинаковыми хеш-кодами, или ситуация, когда два объекта с разными хэш-кодами лежат в одной корзине - это коллизия. Вот почему, когда мы знаем индекс корзины, мы должны проверить, есть ли там кто-нибудь такой же, как наш ключ , и идет на помощь. Если два объекта равны, объект ключ/значение будет заменен, в противном случае - внутри будет добавлен новый объект ключ/значение
      find element - O(1) to O(n) 
insert/delete - O(1) to O(n) 

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

Как видите, HashMap не поддерживает доступ по индексу, но в других случаях работает лучше.

Set - хэш Set. Основан на HashTable, где не используйте значение

[Java потокобезопасные коллекции]

Другие вопросы по тегам