Alex tools
Динамический массив — это не то же самое, что динамически распределяемый массив, который представляет собой массив, размер которого фиксирован при выделении массива, хотя динамический массив может использовать такой массив фиксированного размера в качестве базовой части.
Динамические массивы ограниченного размера и емкость
Массив фиксированного размера будет достаточен в приложениях, где максимальный логический размер является фиксированным (например, по спецификации), или может быть вычислен до выделения массива. Динамический массив может быть предпочтительным, если:
- максимальный логический размер неизвестен или его трудно вычислить, прежде чем массив будет выделен
- считается, что максимальный логический размер, заданный спецификацией, может измениться
- амортизированная стоимость изменения размера динамического массива не оказывает существенного влияния на производительность или скорость отклика
Геометрическое расширение и амортизированная стоимость
Чтобы избежать затрат на многократное изменение размера, динамические массивы изменяют размер на большое количество, например удваивают размер, и используют зарезервированное пространство для будущего расширения. Операция добавления элемента в конец может работать следующим образом:
Динамические массивы являются распространенным примером при обучении амортизированному анализу.
Фактор роста
Ниже приведены факторы роста, используемые несколькими популярными реализациями:
Производительность
Динамический массив имеет производительность, аналогичную массиву, с добавлением новых операций для добавления и удаления элементов:
- Получение или установка значения по определенному индексу (постоянное время)
- Перебор элементов по порядку (линейное время, хорошая производительность кеша)
- Вставка или удаление элемента в середине массива (линейное время)
- Вставка или удаление элемента в конце массива (постоянное амортизированное время)
Сбалансированное дерево может хранить список, в то же время достаточно эффективно обеспечивая все операции как динамических массивов, так и связанных списков, но как вставка в конце, так и итерация по списку происходит медленнее, чем для динамического массива, в теории и на практике из-за отсутствия сопутствующих ресурсов хранения и обхода/манипуляции с деревьями.
Варианты
Gap буферы похожи на динамические массивы, но позволяют эффективно проводить операции вставки и удаления, кластеризованные в одном и том же произвольном месте. Некоторые реализации deque используют массивы deques, которые позволяют вставлять/удалять за амортизированное постоянное время на обоих концах вместо одного конца.
Гудрич представил алгоритм динамического массива, называемый многоуровневыми векторами, который обеспечивает производительность O(sqrt(n)) для вставок или удалений с сохранением порядка из середины массива.
Дерево хэшированного массива (HAT) — это алгоритм динамического массива, опубликованный Ситарски в 1996 году. Хэшированное дерево массивов тратит порядка sqrt(n) объема пространства хранения, где n — количество элементов в массиве. Алгоритм имеет O(1) амортизированную производительность при добавлении серии объектов в конец дерева хешированного массива.
Языковая поддержка
C++ std::vector и Rust std::vec::Vec — это реализации динамических массивов, а также классы ArrayList, поставляемые с Java API и .NET Framework.
Общий класс List, поставляемый с версией 2.0 .NET Framework, также реализован с использованием динамических массивов. OrderedCollection в Smalltalk — это динамический массив с динамическим начальным и конечным индексами, что делает удаление первого элемента также O(1).
Реализация списка типов данных (list datatype) Python представляет собой динамический массив.
Delphi и D реализуют динамические массивы в основе языка.
Универсальный пакет Ada Ada.Containers.Vectors обеспечивает реализацию динамического массива для данного подтипа.
Многие языки сценариев, такие как Perl и Ruby, предлагают динамические массивы как встроенный примитивный тип данных.
Несколько кроссплатформенных сред предоставляют реализации динамических массивов для C, включая CFArray и CFMutableArray в Core Foundation, а также GArray и GPtrArray в GLib.
[expert_bq id=»1570″]Изучив общие правила, он дал хорошее представление о том, как динамические массивы будут работать при использовании с другими функциями Excel. Если же вы хотите что-то уточнить, обращайтесь ко мне![/expert_bq] Передача динамических массивов в функцию осуществляют через указание на начало массива указателей. То есть объявляют тип указателя, содержащего данные об адресе соответствующего первого элемента массива.Использование динамических массивов с другими функциями Excel
- максимальный логический размер неизвестен или его трудно вычислить, прежде чем массив будет выделен
- считается, что максимальный логический размер, заданный спецификацией, может измениться
- амортизированная стоимость изменения размера динамического массива не оказывает существенного влияния на производительность или скорость отклика
Пример: Дан случайный массив. Найти сумму элементов между первым минимальным и последним максимальным. Сделайте 2 версии — с использованием методов и без их использования. Выдайте время работы каждой версии (для достаточно больших массивов) — можно использовать System.DateTime.Now