LINUX.ORG.RU
ФорумTalks

Терминология CS: массив

 , ,


1

3

А вам когда-нибудь доводилось искать/придумывать точные определения для АТД?

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

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

Хотя, конечно, хотелось бы какой-то строгости, желательно, математической.

Стандарты языков обычно ссылаются на стандарт

ISO/IEC 2382:2015 - Information technology — Vocabulary,

у которого есть и русский перевод (хотя формально переводом это сложно назвать)

ГОСТ 33707-2016 (ISO/IEC 2382:2015) Информационные технологии СЛОВАРЬ

====

Пример определения «array»:

ISO:

2122360 array

aggregate that is an instance of an array type and each element or appropriate group of elements in which may be referenced randomly and independently of the others

Note 1 to entry: array: term and definition standardized by ISO/IEC [ISO/IEC 2382-15:1999].

Note 2 to entry: 15.03.08 (2382)

[SOURCE:ISO-IEC-2382-15 * 1999 * * * ]

соотв. нужно еще определение array type:

2122392 array type
composite type whose components are the same data type

Note 1 to entry: Array types may be organized and referenced as if the components were arranged in columns, rows, etc.

Note 2 to entry: array type: term and definition standardized by ISO/IEC [ISO/IEC 2382-15:1999].

Note 3 to entry: 15.04.19 (2382)

[SOURCE:ISO-IEC-2382-15 * 1999 * * * ]

и определение aggregate:

2122358 aggregate

structured collection of components, where the components may have the same or different data structure, and where the data structure of the collection itself may also be a constituent part of a corresponding composite type

Note 1 to entry: aggregate: term and definition standardized by ISO/IEC [ISO/IEC 2382-15:1999].

Note 2 to entry: 15.03.06 (2382)

[SOURCE:ISO-IEC-2382-15 * 1999 * * * ]

ГОСТ:

4.656 массив данных: Конструкция данных, компоненты которой идентичны по своим характеристикам и перечисляются как значения функции от фиксированного количества целочисленных аргументов.

Примечание - Количество аргументов определяет размерность массива.

(en array)

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

Но российский вариант определения массива по госту поверг меня в предшоковое состояние. Это же хрень какая-то, а не определение?

PS:

ГОСТ

ISO

★★★★

Последнее исправление: soomrack (всего исправлений: 1)

Хотя, конечно, хотелось бы какой-то строгости, желательно, математической.

зачем нужна наукообразность на пустом месте? Ты хочешь писать бумаги в журналы по философии CS?

seiken ★★★★★
()

Но российский вариант определения массива по госту поверг меня в предшоковое состояние. Это же хрень какая-то, а не определение?

По-моему, как раз это более точное, но бесполезное определение (как в том анекдоте про математика и воздушный шар). Типа есть многомерный массив ar, его элементы в таком случае будут ar[i,j,k,..], где i, j, k — целые. Другое дело, что, как я понимаю, в массиве главное — это random access, а тут этого как раз и нет.

knovich
()
Ответ на: комментарий от knovich

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

А для индексов обычно говорили (когда я учился) индексированный массив, массив проиндексированный целыми числами от 0 до n-1, или парами целых чисел и пр.

soomrack ★★★★
() автор топика

Скорее всего, оно списано с советского ГОСТа или другого нормативного документа, будет тебе кто-то переводить, ага.

Irma ★★
()
Ответ на: комментарий от knovich

Другое дело, что, как я понимаю, в массиве главное — это random access, а тут этого как раз и нет.

С третьей стороны на уровне реализации это может быть вообще не массив, а класс

praseodim ★★★★★
()
Ответ на: комментарий от knovich

Я бы предложил считать массивом любой контейнер, у которого случайный доступ к элементу всегда занимает О(1).

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

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Это пока ты не упрешься во взаимное недопонимание перерастающее в конфликты.

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

soomrack ★★★★
() автор топика
Ответ на: комментарий от AntonI

Я бы предложил считать массивом любой контейнер, у которого случайный доступ к элементу всегда занимает О(1).

Ну вот да. До некоторых пор это нормальное определение. Обычно так и говорят. Ну или тыкают в int a[10] и говорят, что вот это пример массива.

Но лучше уточнить, что тип данных у элементов одинаков, доступ независимый (а значит можно сделать за O(1)) и произвольный.

soomrack ★★★★
() автор топика
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от soomrack

Терминология упрощает общение, но если её нет - каждый раз снача можно прийти к некоему терминологическому консесусу, а потом уже говорит предметно.

Вот эту шню мы назовём тирьямпампацией, и погнали!

А вот когда начинается рубилово- это вуглускр/неи это не вуглускр! - вот такое пустая трата времени.

Кстати основная проблема философии, что они обычные слова юзают как термины. Дальше я ниче не понимаю что они говорят:-(

AntonI ★★★★
()
Ответ на: комментарий от soomrack

доступ независимый (а значит можно сделать за O(1))

А можно и не сделать. Скажем в мапе доступ независимый, но O(ln N)

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Согласен, но есть один маленький нюанс: это все хорошо работает среди квалифицированных людей, когда у них есть твердый фундамент в виде опыта или фундаментальных знаний, а вот на этапе обучения, когда твоя аудитория это студенты, нужна строгость, тут нельзя ткнуть в int a[n] и сказать что вот это массив, а дальше сами сообразите, нужно как-то разнести АТД, и определить основные свойства, иначе у них будет каша в голове, и соотв. в коде.

soomrack ★★★★
() автор топика
Ответ на: комментарий от AntonI

А можно и не сделать. Скажем в мапе доступ независимый, но O(ln N)

А можно и не сделать… Поэтому O(1) в определение массива и не вносят, это вопросы реализации, которая много от чего зависит.

soomrack ★★★★
() автор топика
Ответ на: комментарий от soomrack

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

AntonI ★★★★
()
Ответ на: комментарий от AntonI

В моем понимании массив это вектор элементов + алгоритм преобразованию ключа в оффсет в векторе занимающий О(1). Это для многомерных массивов актуально.

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

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)

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

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от AntonI

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

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Вот скажем в математике функция распределения это совсем не то же самое что в физике.

Кого будем расстреливать?:-)

AntonI ★★★★
()
Ответ на: комментарий от peregrine

Это независимо произошло скорее всего.

Таких историй овердофигища. Скажем термин индукция…

AntonI ★★★★
()
Ответ на: комментарий от AntonI

основная проблема философии, что они обычные слова юзают как термины

Ну да, только в философии такая проблема.

Bad_ptr ★★★★★
()

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

cobold ★★★★★
()
Ответ на: комментарий от AntonI

В моем понимании массив это вектор элементов

Вы даёте определение через определение. То есть сначала, надо бы сказать, что значит «вектор элементов» и «элемент».

FishHook
()

Массив это не АТД, это сплошной кусок (виртуальной) оперативной памяти. Это все, что нужно знать про массив.

untitl3d
()
Ответ на: комментарий от AntonI

Что такое вектор это как раз понятно - элементы одинакового типа расположенные в памяти подряд.

То есть, если у меня есть структура, все поля которой имеют один и тот же тип, то согласно вашему определению - это вектор

FishHook
()
Ответ на: комментарий от soomrack

нет произвольного и независимого доступа

И что? Произвольный и независимый доступ являются артефактами реализации массивов данных в ЯП, а не каким-то заранее заданным свойством.

массив проиндексированный целыми числами от 0 до n-1, или парами целых чисел

Ну тогда хэш подходит под это определение. Вычисление адреса по индексу это простейшая хэш функция.

no-such-file ★★★★★
()

российский вариант определения массива по госту поверг меня в предшоковое состояние. Это же хрень какая-то, а не определение?

они же по сути одинаковые.

По ISO это две разных характеристики - однотипность (type array) и перечислимость (array).

По ГОСТ одно понятие - и однотипность, и перечислимость.

ISO считает, что один человек - это объект учета «один человек». Два человека - это объект учета «человеки». И только когда договоримся, кто из них 1 а кто 2, тогда «человеки» становятся «массивом человеков».

По ГОСТ судя по всему подразумевается, что зачем вводить отдельный объект учета, если его сразу и не посчитать?

Toxo2 ★★★★
()

а при чём тут Counter Strike?

Psilocybe ★★★★
()
Ответ на: комментарий от Toxo2

Потому что индексация бывает разной. Она может и быть перекрывающейся и экзотической. Например, словарь это тоже массив, но проиндексированный множеством ключей, которые могут быть тоже словами. «ассоциативный массив».

soomrack ★★★★
() автор топика
Последнее исправление: soomrack (всего исправлений: 1)
Ответ на: комментарий от soomrack

индексация бывает разной

Индексация – это биекция «произвольной хрени» на натуральный ряд ©.
А в ассоциативных массивах для удобства есть промежуточный слой абстракции (словарь).

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

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

soomrack ★★★★
() автор топика
Ответ на: комментарий от soomrack

Индексом может выступать все что угодно

Ага, но оно сводимо к натуральному ряду.

одному и тому же элементу может соответствовать разный индекс.

Это уже не массив по ГОСТ / ISO.

И попробуй в бухгалтерии получить несколько жалований/зарплат/премий в 1 ведомости на 1 свою фамилию :)

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

Ага, но оно сводимо к натуральному ряду.

и к конструкции из пустых множеств 0, (0), (0, (0))…, но смысл?

Это уже не массив по ГОСТ / ISO.

Вполне себе массив по ISO, т.к. там в определении про индексацию ничего не сказано.

soomrack ★★★★
() автор топика
Ответ на: комментарий от soomrack

словарь это тоже массив

вот и пошло терминологическое рубилово;-)

Я таки больше скажу - ассоциативный массив может быть реализован через вектор пар ключ:значение, т.е. он будет дважды массивом!

AntonI ★★★★
()
Ответ на: комментарий от soomrack

и к конструкции из пустых множеств 0, (0), (0, (0))…, но смысл?

«Бог создал целые числа, всё остальное — дело рук человека» // Кронекер ©.

quickquest ★★★★★
()
Ответ на: комментарий от Toxo2

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

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Везде по другому.

Массив - это по определению целочисленные индексы. Или вон говорят - вообще натуральные.

Всякие списки, словари, и прочая - это уже абстракции верхнего уровня.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Массив - это по определению целочисленные индексы. Или вон говорят - вообще натуральные.

В хэш таблице тоже целочисленные индексы или вообще натуральные могут быть:-)

списки, словари, и прочая - это уже абстракции верхнего уровня.

Вообще то того же, контейнеры.

Все таким массив - это однотипные элементы лежащие в памяти друг за другом. С точностью до выравнивания:-)

AntonI ★★★★
()
Ответ на: комментарий от AntonI

Все таким массив - это однотипные элементы лежащие в памяти друг за другом. С точностью до выравнивания:-)

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

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

soomrack ★★★★
() автор топика
Ответ на: комментарий от AntonI

Строго говоря - действительно по ISO получается, что словари и хэшмапы - массивы.

В реальности-то под массивам везде имеется в виду возможность именно целочисленной адресации каждого элемента. В том числе - потому что у этого есть однозначная аппаратная аналогия с адресами и смещением.

У словаря нет аппаратной аналогии. Словарь это массив + биекция.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

действительно по ISO получается, что словари и хэшмапы - массивы

Скорее по ГОСТУ.

vvn_black ★★★★★
()
Ответ на: комментарий от soomrack

Слова про виртуальное адресное пространство и пр. я бы опустил - это тоже детали реализации:-)

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

AntonI ★★★★
()
Ответ на: комментарий от AntonI

или 1, если это паскаль

или PostgreSQL

SELECT (ARRAY['a','b','c'])[1];

a

Toxo2 ★★★★
()
Ответ на: комментарий от AntonI

А смысл им лежать прям друг за другом? Если это, скажем, строки переменной длинны? Мы говорим – массив строк, подразумевая, что элементы – строки, и можно быстро взять каждую в отдельности и поработать с ней (в т.ч. увеличив или обрезав). Да, реализация скорее всего будет в виде массива указателей (или ссылок), и указатели будут лежать в памяти друг за другом. Но это уже детали реализации, в т.ч. и в том, что массив строк реализуется через массив указателей.

soomrack ★★★★
() автор топика
Ответ на: комментарий от soomrack

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

Все таки сложные абстракции нажо делать из простых.

AntonI ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)