Почему мы используем массивы вместо других структур данных?

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

Итак, в чем вообще смысл использования массивов?

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

Почему бы не подумать о том, что делает компьютер с массивом? У нас есть система нумерации домов, потому что у нас есть улицы ПРЯМОЙ. То же самое и с массивами.

lcn 28.08.2013 09:04

Что вы имеете в виду под "другие структуры данных" или "другая форма"? А с какой целью?

tevemadar 02.11.2019 13:54
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
203
2
118 715
3

Ответы 3

За O (1) произвольный доступ, который невозможно обыграть.

Не могли бы вы уточнить, пожалуйста?

Xesaniel 25.12.2008 04:16

В какой момент? Что такое O (1)? Что такое произвольный доступ? Почему его нельзя победить? Еще один момент?

jason 25.12.2008 04:24

O (1) произвольный доступ, это O (N), как описано в ответе Холланда?

Xesaniel 25.12.2008 05:03

O (1) означает постоянное время, например, если вы хотите получить элемент массива n-esim, вы просто обращаетесь к нему напрямую через его индексатор (array [n-1]), например, со связанным списком, у вас есть чтобы найти головку, а затем перейти к следующему узлу последовательно n-1 раз, что составляет O (n), линейное время.

Christian C. Salvadó 25.12.2008 05:04

Обозначение Big-O описывает, как скорость алгоритма зависит от размера его входных данных. Алгоритм O (n) займет вдвое больше времени, чтобы работать с вдвое большим количеством элементов, и в 8 раз дольше, чтобы работать с 8-кратным количеством элементов. Другими словами, скорость алгоритма O (n) зависит от [продолжение ...]

Gareth 25.12.2008 05:06

размер его ввода. O (1) означает, что размер ввода ('n') не влияет на скорость алгоритма, это постоянная скорость независимо от размера ввода.

Gareth 25.12.2008 05:07

O (1) произвольный доступ означает, что для любого k требуется постоянное количество времени для доступа к k-му элементу массива, независимо от длины N массива. Когда Холланд ссылается на O (N), он имеет в виду время, необходимое для поиска определенного элемента в массиве, предполагая, что он находится в случайном порядке.

jason 25.12.2008 05:12

мне нравится ваш ответ, так как он просто объясняет, о чем просили :)

Johannes Schaub - litb 25.12.2008 13:26

Я вижу ваш O (1) и поднимаю вам O (0).

Chris Conway 26.12.2008 07:55

Я ценю ответы, которые удовлетворяют исходный вопрос с наименьшим количеством слов. Но, если я правильно понимаю, мы говорим о массивах C, а не векторах C++ или Java ArrayLists. Поэтому вы должны добавить, что их размер постоянен и указывается во время компиляции.

wilhelmtell 01.01.2009 10:08

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

wilhelmtell 01.01.2009 10:15

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

wilhelmtell 01.01.2009 10:20

@Jason: Доступ к произвольному массиву в лучшем случае физически равен O (log N). Вы можете рассматривать его как O (1), только если вы игнорируете уровень абстракции.

user811773 20.10.2011 15:26

Не все программы делают одно и то же или работают на одном оборудовании.

Обычно это ответ, почему существуют различные языковые функции. Массивы - это основная концепция информатики. Замена массивов списками / матрицами / векторами / любой другой расширенной структурой данных может серьезно повлиять на производительность и быть совершенно невыполнимой в ряде систем. Существует множество случаев, когда использование одного из этих «продвинутых» объектов сбора данных должно использоваться из-за рассматриваемой программы.

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

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

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

Как ни странно, в Java вы должны использовать ArrayList (или LinkedList) вместо Vector. Это связано с синхронизацией вектора, что обычно не требует дополнительных затрат.

ashirley 05.01.2009 14:02

Чтобы увидеть преимущества массивов, нужно увидеть, где требуется возможность доступа O (1) к массивам и, следовательно, с заглавной буквы:

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

  2. Мемоизация (уже вычисленные результаты сложной функции, чтобы вы не вычисляли значение функции снова, скажем, log x)

  3. Приложения высокоскоростного компьютерного зрения, требующие обработки изображений (https://en.wikipedia.org/wiki/Lookup_table#Lookup_tables_in_image_processing)

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