Рубрики
Без рубрики

Краткий анализ производительности массивов и объектов через призму Big O обозначения.

Решение, какая структура данных использовать во время разработки программного обеспечения может быть сложным. Этот блог ищет … с меткой JavaScript, массивами, объектами, новичками.

Решение, какая структура данных использовать во время разработки программного обеспечения может быть сложным. Этот блог стремится помочь вам принять решение, когда дело доходит до встроенных структур данных в JavaScript, объекты и массивы . Их производительность будет проанализирована путем внимательного взгляда на то, как распространенные взаимодействия, такие как доступ к данным, вставка, удаление и поиск с каждым из них.

Оглавление

  • Предварительные условия
  • Цели
  • Объекты
    • Доступ к данным, вставка и удаление
    • Поиск в объектах
    • Объектные методы
  • Массивы
    • Доступ к данным
    • Поиск в массивах
    • Вставка и удаление данных
    • Методы массива
  • Вывод

Предварительные условия

  • Основное знание JavaScript
  • Теоретическое знание Большой О записка (6 минут читается)

Цели

  • Поймите, как объекты и массивы работают через призму Big O обозначения.
  • Объясните, почему добавление элементов в начало массива является дорогой операцией с уважением к пространству и времени.
  • Сравните и сопоставьте время выполнения для массивов и объектов, а также их встроенные методы.

Объекты

Объекты в JavaScript являются неупопорящимися структурами данных пар пар клавишных. Это означает, что нет начала или конца объекта. Когда данные добавляются в объект, данные помещаются в любом месте в нем.

const person = {
  name: 'Kwame',
  age: 30,
  height: 182,
  hobbies: ['reading', 'drawing', 'running']
}

Объекты наиболее ценны, когда порядок не требуется, но быстрый доступ к данным, вставка и удаление имеют приоритет.

Доступ к данным, вставка и удаление

Через призму Big O обозначения, Доступ к данным который включает в себя получение или изменение данных, хранящихся в объекте, выполняется в постоянное время O (1) Анкет Это также верно для Вставка а также удаление данных.

  • Вставка – O (1)
  • Удаление – O (1)
  • доступ – O (1)

Поиск в объектах

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

Объектные методы

Доступ к всем ключам объекта через Object.keys () это O (n) Поскольку это время выполнения прямо пропорционально количеству ключей, которые есть у объекта. То же самое относится и к экземпляру доступа к значениям объекта с Object.values () Анкет Технически больше работы, но его обозначения могут быть аппроксимированы с O (n) Анкет Получение всех записей объекта с Object.Entries () Технически включает в себя гораздо больше вычислений, чем доступ к ключам и значениям, потому что он должен составлять клавиши и значения в массиве. Однако его сложность может быть собрана до O (n) Анкет Наконец, в проверке, чтобы увидеть, имеет ли объект свойство или нет с встроенным методом HasownProperty () Постоянное время O (1) Анкет Это потому, что он просто проверяет наличие собственности и возвращает логическое.

  • Object.keys – O (n)
  • Object.creules – O (n)
  • Object.Entries – O (n)
  • HasownProperty – O (1)

Массивы

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

Доступ к данным

Операции, которые включают доступ (получение или обновление данных), являются быстрыми, они имеют большой O постоянного времени O (1) Анкет Это является результатом индексации массивов. Доступ к элементу в массиве с индексом 0 требует того же времени, чтобы получить доступ к элементу с индексом 1000.

Поиск в массивах

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

Вставка и удаление данных

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

Вставка элементов в конце массива с использованием push () Метод имеет большое постоянное время O (1) Анкет Это связано с тем, что JavaScript рассматривает индекс последнего элемента и добавляет новый элемент с индексом, эквивалентным численному значению последнего индекса плюс 1. С другой стороны, вставка элемента в начале массива является линейным временем O (n) Анкет Это связано с тем, что все существующие элементы в массиве должны быть повторно индексированы. Те же принципы применяются при удалении элементов из массива. Таким образом, используя толкать и поп всегда быстрее, чем использование сдвиг и без устранения Анкет

Методы массива

Большой O из нескольких стандартных встроенных методов массивов уже обсуждался в приведенных выше параграфах (Push, POP, Shift и Unshift).

  • push: O (1) Анкет
  • Поп: O (1) Анкет
  • Сдвиг: O (n) Анкет
  • без устранения: На)

Другими методами являются CONCAT, SLICE, сплайс и все функции высшего порядка. (Foreach, Map, Filter, уменьшение и т. Д.). Ниже приведены их соответствующий анализ производительности, основанный на Big O.

  • concat: O (n) Анкет (добавление или объединение двух массивов)
  • Slice: O (n) Анкет (возвращает копию части или всего массива)
  • Сплайс: O (n) Анкет (Удалите или добавьте элементы в любом месте в массиве)
  • foreach/map/filter/уменьшить/и т. Д.: O (n) Анкет

Для получения дополнительной информации о том, как работает каждый из них, вы можете обратиться к MDN Web Docs Анкет

Вывод

  • Объекты быстрее практически во всем, но не имеют никаких заказов.
  • Массивы хороши, когда вам нужны заказанные данные.
  • Работая с массивами, если это не абсолютно необходимо, избегайте добавления и удаления элементов в/с начала массива.

Изображение обложки от Ади Гольдштейн на unsplash

Оригинал: “https://dev.to/adafia/brief-performance-analysis-of-arrays-and-objects-through-the-lens-of-big-o-notation-4id3”