в чем разница между array и list

Свой инструмент нужно знать в лицо: обзор наиболее часто используемых структур данных

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list
Некоторое время назад я сходил на собеседование в одну довольно большую и уважаемую компанию. Собеседование прошло хорошо и понравилось как мне, так и, надеюсь, людям его проводившим. Но на следующий день, в процессе разбора полетов, я обнаружил, что в ходе собеседования ответ на как минимум один вопрос был неверен.

Вопрос: Почему поиск в python dict на больших объемах данных быстрее чем итерация по индексированному массиву?

Ответ: В dict хранятся хэши от ключей. Каждый раз, когда мы ищем в dict значение по ключу, мы сначала вычисляем его хэш, а потом (внезапно), выполняем бинарный поиск. Таким образом, сложность составляет O(lg(N))!

На самом деле никакого бинарного поиска тут нет. И сложность алгоритма не O(lg(N)), а Amort. O(1) — так как в основе dict питона лежит структура под названием Hash Table.

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

1. Array — он же индексированный массив.

Array — это коллекция фиксированного размера, состоящая из элементов одинакового типа.

Почему время доступа к элементу по индексу постоянно? Массив состоит из элементов одного типа, имеет фиксированный размер и располагается в непрерывной области памяти => чтобы получить j-й элемент массива, нам достаточно взять указатель на начало массива и прибавить к нему размер элемента умноженный на его индекс. Результат этого несложного вычисления будет указывать как раз на искомый элемент массива.
*aj = beginPointer + elementSize*j-1

Примеры:
с/с++: int i_array[10];
java/C#: int[10] i_array;
Python: array.array
php: SplFixedArray

2. List (список).

List — это список элементов произвольного типа переменной длины (то есть мы можем в любой момент добавить элемент в список или удалить его). Список позволяет перебирать элементы, получать элементы по индексу, а так же добавлять и удалять элементы. Реализации у List возможны разные, основные — это (Single/Bidirectional) Linked List и Vector. Классический List предоставляет возможность работы с ним напрямую и через итератор, интерфейсы обоих классов рассмотрим ниже.

Перейдем к реализациям списка.

2.1 Single Linked List

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list
Однонаправленный связный список (односвязный список) представляет из себя цепочку контейнеров. Каждый контейнер содержит внутри себя ссылку на элемент и ссылку на следующий контейнер, таким образом, мы всегда можем переместиться по односвязному списку вперед и всегда можем получить значение текущего элемента. Контейнеры могут располагаться в памяти как им угодно => добавление в односвязный список нового элемента тривиально.

Bidirectional Linked List мы подробно рассматривать не будем, вся разница между ним и Single Linked List заключается в том, что в контейнерах есть ссылка не только на следующий, но и на предыдущий контейнер, что позволяет перемещаться по списку не только вперед, но и назад.

2.2 Vector

Vector — это реализация List через расширение индексированного массива.

Очевидно, что главное преимущество Vector’а — быстрый доступ к элементам по индексу, унаследовано им от обычного индексированного массива. Итерировать Vector так же достаточно просто, достаточно увеличивать некий счетчик на единицу и осуществлять доступ по индексу. Но за скорость доступа к элементам приходиться платить временем их добавления. Для того чтобы вставить элемент в середину Vector’a (insert-after) необходимо скопировать все элементы между текущим положением итератора и концом массива, как следствие время доступа в среднем O(N). То же и с удалением элемента в середине массива, и с добавлением элемента в начало массива. Добавление элемента в конец массива при этом может быть выполнено за O(1), но может и не быть — если опять таки потребуется копирование массива в новый, потому говорится, что добавление элемента в конец Vector’а происходит за Amort. O(1).

Примеры:
с/с++: std::vector
Java: java.util.ArrayList
C#: System.Collections.ArrayList, System.Collections.List
Python: list

3. Ассоциативный массив(Словарь/Map)

Коллекция пар ключ=>значение. Элементы (значения) могут быть любого типа, ключи обычно только строки/целые числа, но в некоторых реализация диапазон объектов, которые могут быть использованы в качестве ключа, может быть шире. Размер ассоциативного массива можно изменять путем добавления/удаления элементов.

3.1 Hash Table

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list
Как можно догадаться из названия, тут используются хэши. Механика работы Hash Table следующая: в основе лежит все тот же индексированный массив, в котором индексом работает значение хэша от ключа, а значением — ссылка на объект, содержащий ключ и хранимый элемент (bucket). При добавлении элемента — хэш функция вычисляет хэш от ключа и сохраняет ссылку на добавляемый элемент в ячейку массива с соответствующим индексом. Для получения доступа к элементу мы опять таки берем хэш от ключа и, работая так же как с обычным массивом получаем ссылку на элемент.

То есть, кроме значения ключа, она так же получает текущий размер массива, это необходимо для определения длины хэша: если мы храним всего 3 элемента — нет смысла делать хэш длиной в 32 разряда. Обратная сторона такого поведения хэш функции — возможность коллизий. Коллизии на самом деле характерны для Hash Table, и существует два метода их разрешения:

Chaining:
в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list
Каждая ячейка массива H является указателем на связный список (цепочку) пар ключ-значение, соответствующих одному и тому же хеш-значению ключа. Коллизии просто приводят к тому, что появляются цепочки длиной более одного элемента.

В массиве H хранятся сами пары ключ-значение. Алгоритм вставки элемента проверяет ячейки массива H в некотором порядке до тех пор, пока не будет найдена первая свободная ячейка, в которую и будет записан новый элемент. Этот порядок вычисляется на лету, что позволяет сэкономить на памяти для указателей, требующихся в хеш-таблицах с цепочками.
в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Примеры:
c++: за исключением QHash автору не известныboost::unordered_map/boost::unordered_set (by NickLion)
java: java.util.HashMap
c#: System.Collections.Hashtable, System.Collections.Dictionary
python: dict
php: array()

3.2 Binary Tree

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list
На самом деле не просто Binary Tree, а Self-balancing Binary Tree. Причем следует отметить, что существует несколько различных деревьев, которые могут быть использованы для реализации Ассоциативного массива: red-black tree, AVL-tree и т.д. Мы не будем рассматривать каждое из этих деревьев в деталях, так как это возможно тема еще одной, отдельной статьи, а может и нескольких (если изучать деревья особо тщательно). Опишем только общие принципы.

Определение: двоичное дерево — древовидная структура данных в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками. В случае, если у узла нет наследников — он называется листовым узлом.

4. Множество (Set).

Immutable набор элементов. Множество определяется один раз — при создании, и в дальнейшем предоставляет доступ к элементам только на чтение. Множество нельзя расширить, равно как нельзя и удалить из него элементы или изменить элемент множества. В качестве базы для реализации данной коллекции обычно используется Hash Table — описание которого см. Выше.

Множество — это просто реализация абстракции математического множества, т.е. набора уникальных различимых элементов. (спс. danilI)
Примеры:
c++: std::set
java: java.util.Set
C#: System.Collections.HashSet
python: set/frozenset

Сравнительные характеристики структур данных:
в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Структуры данных в различных языках программирования:
в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Ссылки:

Так же автор заглянул в исходники PHP и почитал доку по STL.

Upd. Да, в питоне есть обычный индексированный массив (array.array). Спасибо enchantner. С поправкой, тип не обязательно числовой, тип можно указывать.

Upd.
Из комментариев zibada:
Да, вот как раз из-за отсутствия описания итерации по Map из статьи вообще непонятно, зачем, казалось бы, нужны деревья, когда есть хэши. (O(logN) против O(1)).

Нужны они затем, что перечислять элементы Map (или Set) можно хотеть:
— в любом, негарантированном порядке (HashMap, встроенные хэши в некоторых скриптовых языках);
— в порядке добавления (LinkedHashMap, встроенные хэши в некоторых других скриптовых языках);
— в порядке возрастания ключей + возможность перебрать только ключи в заданном диапазоне.

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

Источник

C # Array vs List

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Разница между массивом C # и списком

Что такое массив?

Массив может быть последовательным ассортиментом сопоставимых данных, которые будут доступны в соответствии с «индексом». Это лучший стиль системы, во время которой погода может находиться в непрерывном месте памяти.

В массиве индекс начинается с нуля, поэтому для доступа к основной части массива «numarray» его следует записать как numarray (0).

Массив может быть последовательным разделом памяти, который занимает n * размер (тип) байтов, где n означает, что длина массива и размер (тип) соответствуют размеру в памяти, необходимому для хранения сортировки информации, к которой вы переходите использовать в массиве. Это говорит о том, что, если вы хотите сформировать массив из ста int, и каждый int занимает четыре байта, вам, возможно, придется иметь раздел неиспользуемой памяти размером не менее четырех сотен байтов (100 * 4). Это дополнительно подразумевает, что массив довольно дешев в формировании, использовании и использовании в результате своих фрагментов памяти.

Что такое список?

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

Сравнение лицом к лицу между C # Array и List

Ниже приведено 5 лучших отличий между C # Array и List. в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Ключевая разница между массивом C # и списком

C # Array vs Сравнительная таблица списков

Ниже приведено самое лучшее сравнение между C # Array и List

Мы видели сравнение использования памяти C # Array и List в памяти языка C #. Для скорости, как правило, стоит любить обычные массивы. Прибыль производительности имеет решающее значение.

Списки используются в C # гораздо чаще, чем массивы, однако есть некоторые случаи, когда массивы будут (или должны) использоваться, вместе с тем, если ваши данные вряд ли значительно вырастут или если вы справляетесь со сравнительно большим количеством данных который должен быть принужден для индексации обычно.

Позвольте мне предложить вам 2 образца списков, которые нарушают принципы массива. В списке ссылок каждая часть указывает на следующую часть, поэтому я просто помещу запасную часть между двумя существующими частями или уберу одну и исправлю оставшиеся 2 (предыдущая и следующая); в то время как я получу доступ к частям через индекс, я буду делать это только путем перехода от одной части к проверке и проверке, поэтому она не индексируется. Другим примером является то, что очередь, где я буду только повысить чаевые и забрать с самого начала; если я хочу получить доступ к частям через индекс, это выполнимо, однако, я явно не плохо обращаюсь с правильной сортировкой абстрактных данных. Неважно, если реализация даст это просто.

Рекомендуемая статья

Источник

Чем отличается массив от списка Python – таблица сравнения

Массивы и списки Python являются важной структурой данных Python. И список, и массив используются для хранения данных в Python. Эти структуры данных позволяют нам индексировать, нарезать и повторять. Но они отличаются друг от друга. В этом руководстве мы узнаем существенные различия между списком и массивом Python.

Вступление

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

С другой стороны, Python не предоставляет встроенной поддержки массива. Нам нужно импортировать модуль массива, или использовать модуль массива из пакета NumPy в программе Python. И это основное различие между массивом и списком. Прежде чем углубиться в эту тему, давайте кратко познакомимся с обеими структурами данных.

Список

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

Ниже приведены примеры списка.

В приведенном выше списке первым элементом является целое число; второй – это строка, а третий – список символов.

Массивы

Массив в Python – это также линейная структура данных, в которой хранятся данные. Он также упорядочен, изменяем и заключен в квадратные скобки. Он может хранить неуникальные элементы. Но есть ограничения на хранение значений разных типов данных.

Для работы с массивом в Python нам нужно импортировать либо модуль массива, либо Numpy.

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

Пример – 2: Использование массива Numpy

Мы указали тип строки и сохранили строковое значение.

Разница между массивом и списком

Здесь мы обсудим различия между массивом и списком.

СписокМассив
1.В списке могут храниться значения разных типов.Он может состоять только из значений одного типа.
2.Список не может обрабатывать прямые арифметические операции.Массив может напрямую обрабатывать арифметические операции.
3.Списки представляют собой встроенную структуру данных, поэтому нам не нужно их импортировать.Перед работой с массивом нам необходимо импортировать его модуль.
4.Списки менее совместимы, чем массивы для хранения данных.Массивы более совместимы, чем список.
5.Он потребляет большой объем памяти.Это более компактный по объему памяти по сравнению со списком.
6.Подходит для хранения более длинной последовательности элементов данных.Подходит для хранения более короткой последовательности элементов данных.
7.Мы можем распечатать весь список, используя явный цикл.Мы можем распечатать весь список без использования явного цикла.
8.Он может быть вложенным, чтобы содержать различные типы элементов.Он может содержать любые вложенные элементы одинакового размера.

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

Источник

Список C # против массива

в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Различия между списком C # и массивом

Класс C # List представляет строго типизированный список объектов, к которым индекс может получить доступ, и он поддерживает сохранение значений определенного типа без приведения к объекту или из него.

Добавьте целочисленные значения в коллекцию List:

List intList = new List ();

Добавьте строковые значения в коллекцию List:

Цвета списка = новый список ();

Получить элементы из коллекции List с помощью цикла for:

foreach (цвет строки в цветах) (

Объявите массив в C #:

datatype () typeName; // DataType используется для указания типа элементов в массиве

двойной () баланс = новый двойной (50);

Присвоение значений массиву:

double () остаток = (23, 0; 34, 56; 44, 32);

Доступ к элементам массива;

Foreach (значение int в балансе) (

Console.WriteLine («элемент:» + значение);

Создайте и инициализируйте массив одновременно:

Int () steps = new int (6) (1, 2, 3, 4, 5, 6);

Скопируйте переменную массива в другую целевую переменную массива:

и цель, и источник указывают на одну и ту же область памяти

Сравнение лицом к лицу между C # List и Array Infographics

Ниже приведены 8 лучших отличий между C # List и Array. в чем разница между array и list. Смотреть фото в чем разница между array и list. Смотреть картинку в чем разница между array и list. Картинка про в чем разница между array и list. Фото в чем разница между array и list

Ключевые различия между C # List и Array

Обе версии C # List и Array являются популярным выбором на рынке; Давайте обсудим некоторые основные различия между C # List и Array:

Сравнение лицом к лицу между C # List и Array

Ниже приведено самое лучшее сравнение между C # List и Array.

Основа сравнения между C # List и ArrayСписокмассив
ТворчествоПостроен на вершине массиваИсходная структура данных, основанная на концепции индекса
ПамятьЗанимать больше памяти, чем массивПамять эффективных
длинаДлина варьируетсяДлина фиксированного размера
использованиеЧастые вставки и удаленияЧастый доступ к элементам
Изменение размераИзменение размера списка носит динамический характерИзменение размеров массивов стоит дорого
СтруктураНесмежная памятьНепрерывное расположение памяти
индексированиеНеиндексированная структураИндекс на основе самого низкого адреса в качестве первого и самого высокого адреса в качестве последнего
ДоступЭлемент доступа занимает много времени, хотя основывается на позиции элементаЭлемент доступа является постоянной функцией независимо от местоположения элемента.

Оба C # List vs Array являются разными типами, имеют разные возможности и хранят свои данные по-разному. Эти возможности хранения и дизайн структур данных C # List и Array делают их уникальными по-своему. Массив имеет фиксированный размер и после его выделения нельзя добавлять или удалять элементы из него, также все элементы должны быть одного типа. Таким образом, это типобезопасная и наиболее эффективная линейная структура данных с точки зрения скорости и производительности. Кроме того, массив поддерживает несколько измерений. Список предоставляет более общие возможности и получен из API-интерфейсов Collection. В отличие от Array, они динамичны по своей природе, могут изменять размеры автоматически при частой вставке и удалении элементов. По сути, это типобезопасная версия структуры данных ArrayList. Функция обеспечения безопасности типов означает, что не будет упаковок или распаковок, которые повысят производительность, и если кто-либо попытается добавить элемент неправильного типа, он выдаст ошибку во время компиляции.

Рекомендуемая статья

Источник

Array versus List: когда использовать что?

какие сценарии, когда один предпочтительнее другого? И почему?

14 ответов

редко, на самом деле, что вы хотели бы использовать массив. Определенно используйте List в любое время, когда вы хотите добавить/удалить данные, так как изменение размера массивов дорого. Если вы знаете, что данные фиксированной длины, и вы хотите микро-оптимизировать для некоторых очень специфический причина (после тестирования), то массив может быть полезен.

что сказал, я делаю много использования массивов в my protobuf-чистая проект; полностью для производительности:

но это, безусловно, исключение; для общей линии обработки бизнеса, List выигрывает каждый раз.

действительно просто отвечая, чтобы добавить ссылку, о которой я удивлен, еще не упоминалось: запись блога Эрика Липперта на «массивы считаются чем-то вредным.»

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

использовать массив, когда вы имеете дело с данными, то есть:

используйте список для:

используйте hashmap для:

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

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

ясно, что модификация » strChars «не будет мутировать исходный объект» str», независимо от уровня реализации знаний о «STR», лежащих в основе тип.

но предположим, что

в этом случае из этого фрагмента кода не ясно, будет ли метод insert мутировать исходный объект » str » или нет. Для этого требуется знание уровня реализации строки, чтобы сделать это определение, которое нарушает дизайн контрактным подходом. В случае String это не имеет большого значения, но это может быть большое дело почти в каждом другом случае. Установка списка только для чтения помогает, Но приводит к ошибкам во время выполнения, а не во время компиляции.

большую часть времени, используя List хватило бы. А List использует внутренний массив для обработки данных, и автоматически изменяет размер массива при добавлении элемента List чем его текущая емкость, что делает его более простым в использовании, чем массив, где вам нужно знать емкость заранее.

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

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

теперь, если у вас есть список элементов, и вы просто хотите их отобразить, скажем, на веб-странице массив-это контейнер, который вам нужно использовать.

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *