Каково фактическое определение массива?

Возможный дубликат:
Массивы, что точка?

Я пытался задать этот вопрос раньше в В чем разница между массивом и списком?, но мой вопрос был закрыт, прежде чем прийти к окончательному ответу (подробнее об этом).

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

Способы размышления об этом вопросе:

  • Представьте, что вы разрабатываете новый язык программирования, и вы решили реализовать в нем массивы; что это значит? Какими будут свойства и возможности этих вещей. Если это зависит от типа языка, как это?
  • Что делает массив массивом?
  • Когда массив не является массивом? Когда это, например, список, вектор, таблица, карта или коллекция?

Возможно, нет четкого определения того, что такое массив, если это так, то есть ли какие-либо стандартные или почти стандартные допущения или что такое массив? Есть ли какие-то общие области? Может быть, есть несколько определений, если это так, я ищу самую точную в каждом из них.

Примеры языка:

(Исправьте меня, если я ошибаюсь ни на одном из них).

  • C-массивы представляют собой непрерывные блоки памяти одного типа, которые могут быть пройдены с использованием арифметики указателя или доступны в определенной точке смещения. Они имеют фиксированный размер.
  • Массивы в JavaScript, Ruby и PHP имеют переменный размер и могут хранить объект/скаляр любого типа, который они также могут вырастить, или удалить элементы из них.
  • Массивы PHP бывают двух типов: числовые и ассоциативные. Ассоциативные массивы содержат элементы, которые хранятся и извлекаются с помощью строковых ключей. Числовые массивы имеют элементы, которые хранятся и извлекаются целыми числами. Интересно, если у вас есть: $eg = array('a', 'b', 'c') и вы unset($eg[1]), вы все равно извлекаете 'c' с помощью $eg[2], только теперь $eg[1] - undefined. (Вы можете вызвать array_values() для повторной индексации массива). Вы также можете смешивать строки и целые ключи.

На этом этапе подозрения, что массивы C являются единственным истинным массивом здесь и что, строго говоря, для массива, который является массивом, он должен иметь все характеристики, которые я упоминаю в этой первой точке. Если это так, то опять-таки это подозрения, которые я ищу, чтобы подтвердить или отклонить - массивы в JS и Ruby на самом деле являются векторами, а массивы PHP - это, вероятно, таблицы какого-то рода.

Заключительное примечание: я создал эту вики сообщества, поэтому, если ответы нужно отредактировать несколько раз вместо комментариев, продолжайте и делайте это. Консенсус здесь.

Ответ 1

массив | ərā |

существительное

1 впечатляющий дисплей или диапазон определенного типа вещей: существует огромное количество литературы по теме | недоумение выбора.

2 - упорядоченная компоновка, в частности

  • расположение войск.
    1. Математика: расположение величин или символов в строках и столбцах; матрица.
    2. Вычисление: упорядоченный набор связанных элементов.
    3. Закон: список членов присяжных заседателей.

3 поэтическая/литературная изысканная или красивая одежда: он был одет в тонкую решетку. глагол

  • [транс. ] (usu. быть массивным) отображать или упорядочивать (вещи) определенным образом: на столе в таблице был "шведский стол" | силы, направленные против него.
  • [транс. ] (устраивается) одевают кого-то (указанная одежда): они были одеты в венгерскую национальную одежду.
  • [транс. ] Law empanel (жюри). ORIGIN Средний английский (в чувствах [готовность] и [место в готовности]): от древнефранцузских существ, существительных (существительных), исер (глагол), основанных на латинском значении + к германской основе, означающей "подготовить".

Ответ 2

Это или должно быть все об абстракции

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

И все хуже, не лучше.

ОК: есть что-то скромное и неуважительное. Fortran получил право, что мои любимые языки, такие как Ruby, все еще ошибаются: они используют разные синтаксисы для вызовов функций, массивов и атрибутов. Точно как абстрактно это? В fortran function(1) имеет тот же синтаксис, что и array(1), поэтому вы можете изменить один на другой, не изменяя программу. (Я знаю, а не для заданий, а в случае с Фортраном это была, вероятно, случайность наборов персонажей пушистых перфокарт, а не что-то преднамеренное.)

Дело в том, что я действительно не уверен, что x.y, x[y] и x(y) должны иметь различный синтаксис. В чем преимущество присоединения определенной абстракции к определенному синтаксису? Сделать больше заданий для программистов IDE, работающих над преобразованиями рефакторинга?

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

Ответ 3

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

Ответ 4

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

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

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

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

EDIT: в ответ на комментарии Олли:

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

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

Для меня "массив" означает "упорядоченный набор вещей, который, вероятно, эффективно индексируется" и "список" означает "упорядоченный набор вещей, которые могут быть эффективно индексируемыми". Но есть примеры как массивов, так и списков, которые противоречат тенденции; например PHP-массивы, с одной стороны, и Java ArrayLists, с другой стороны. Поэтому, если я хочу быть точным... в языковом агностическом контексте, я должен говорить о "C-подобных массивах" или "связанных списках" или какой-либо другой терминологии, которая дает понять, какую структуру данных я действительно имею в виду. Термины "массив" и "список" бесполезны, если я хочу быть ясным.

Ответ 5

От FOLDOC:

массив

1. < programming > Набор идентично типизированных элементов данных отличающихся их индексами (или "индексами" ). Номер размеров, которые может иметь массив, зависит от языка, но обычно неограниченно.

Массив - это тип данных aggregate. Один обычная переменная (a scalar") может рассматриваться как нулевой размерный массив. Известен также одномерный массив как " vector".

Ссылка на элемент массива написана примерно так: A [i, j, k], где A - имя массива, а i, j и k - индексы. Язык C свойственен тем, что каждый индекс записанные в отдельных скобках, например. А [I] [J] [K]. Это выражает тот факт, что в C N-мерный массив на самом деле является вектор, каждый из элементов которого является N-мерным массивом.

Элементы массива обычно хранятся смежно. Языки различаются относительно того, является ли самый левый или правый индекс изменяется наиболее быстро, т.е. сохраняется ли каждая строка смежно или каждый столбец (для 2D-массива).

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

2. < architecture > A массив процессоров, чтобы не путать с массивный процессор.

Также обратите внимание, что на некоторых языках, когда они говорят "массив", они фактически означают " ассоциативный массив ":

ассоциативный массив

< programming > (Или "хэш", "карта", "словарь" ) array где indices не просто integers но может быть произвольные строки.

awk и его потомки (например, Perl) имеют ассоциативный массивы, которые реализованы с помощью хэш-кодирования для более быстрого Погляди.

Ответ 6

Массив:

  • - конечный набор элементов
  • элементы упорядочены, и это их единственная структура
  • элементы одного типа
  • поддерживается эффективный произвольный доступ
  • не имеет ожиданий эффективных вложений
  • может поддерживать или не поддерживать append

(1) отличает массивы от таких вещей, как итераторы или генераторы. (2) дифференцирует массивы из множеств. (3) дифференцирует массивы из таких вещей, как кортежи, где вы получаете int и строку. (4) дифференцирует массивы из других типов списков. Возможно, это не всегда так, но программист ожидает, что случайный доступ - это постоянное время. (5) и (6), чтобы отказать в дополнительных требованиях.

Ответ 7

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

Ответ 8

массив - это контейнер, а объекты, которые он имеет, не имеют никаких отношений, кроме порядка; объекты сохраняются в непрерывном пространстве абстрактно (высокий уровень, конечно, низкий уровень может также продолжаться), поэтому вы можете получить к ним доступ через слот [x, y, z...]. например, на массив [2,3,5,7,1], вы можете получить 5, используя слот [2] (слот [3] на некоторых языках).

для списка, контейнера тоже, каждый объект (ну, каждый объект-держатель, такой как слот или node), он содержит индикаторы, которые "указывают" на другие объекты (объекты), и это основное отношение; в целом как высокого, так и низкого уровня пространство не является непрерывным, но может быть непрерывным; поэтому доступ к слоту [x, y, z...] не рекомендуется. например, для | -2-3-5-7-1- |, вам нужно сделать путешествие от первого объекта до третьего, чтобы получить 5.