Введение

Операция в компьютерном программировании, операция над структурой данных. В компьютерном программировании, выделение среза массива — это операция, которая извлекает подмножество элементов из массива и формирует из них новый массив, возможно, с другим размером, чем исходный. Типичными примерами выделения среза массива являются извлечение подстроки из строки символов, например, "ell" из "hello", извлечение строки или столбца из двумерного массива или извлечение вектора из матрицы. В зависимости от языка программирования, срез массива может быть создан из не последовательных элементов. Кроме того, в зависимости от языка, элементы нового массива могут быть связаны (то есть совместно использовать память) с элементами исходного массива.

Подробности

Для "одномерных" (одноиндексированных) массивов, векторов, последовательностей, строк и т. д. наиболее распространенной операцией выделения является извлечение нуля или более последовательных элементов. Таким образом, если у нас есть вектор, содержащий элементы (2, 5, 7, 3, 8, 6, 4, 1), и мы хотим создать срез массива от 3-го до 6-го элементов, мы получим (7, 3, 8, 6). В языках программирования, использующих систему индексации, начинающуюся с 0, срез будет от индекса 2 до 5. Уменьшение диапазона любого индекса до одного значения фактически исключает этот индекс. Эта возможность может быть использована, например, для извлечения одномерных срезов (векторов: в 3D – рядов, столбцов и слоев) или двухмерных срезов (прямоугольных матриц) из трехмерного массива. Однако, поскольку диапазон может быть задан во время выполнения, языки со строгой типизацией могут потребовать явного (во время компиляции) указания для фактического исключения тривиальных индексов. Общее выделение срезов массивов может быть реализовано (независимо от того, встроено ли оно в язык) путем обращения к каждому массиву через вектор "дополнений" или дескриптор – запись, содержащую адрес первого элемента массива, а затем диапазон каждого индекса и соответствующий коэффициент в формуле индексации. Эта техника также позволяет немедленно выполнять транспонирование массива, изменение порядка индексов, субдискретизацию и т.п. Для языков, таких как C, где индексы всегда начинаются с нуля, вектор дополнений массива с d индексами имеет как минимум 1 + 2d параметров. Для языков, допускающих произвольные нижние границы для индексов, таких как Паскаль, вектор дополнений требует 1 + 3d элементов. Если абстракция массива не поддерживает истинные отрицательные индексы (как, например, в массивах Ада и Паскаля), то отрицательные индексы для границ среза для данного измерения иногда используются для указания смещения от конца массива в этом измерении. В схемах с индексацией, начинающейся с 1, значение 1 обычно указывает на предпоследний элемент, а в системе с индексацией, начинающейся с 0, – на последний элемент.

История

Понятие выделения подпоследовательностей было известно еще до изобретения компиляторов. Выделение подпоследовательностей как языковая возможность, вероятно, возникло в FORTRAN (1957), скорее как следствие отсутствия проверки типов и диапазонов, чем по замыслу. Эта концепция также упоминалась в предварительном отчете для IAL (ALGOL 58) в том смысле, что синтаксис позволял опускать один или несколько индексов элемента массива (или, например, при вызове процедуры) при использовании в качестве фактического параметра. APL Кеннета Айверсона (1957) обладал очень гибким многомерным выделением подпоследовательностей массивов, что значительно способствовало выразительности и популярности языка. ALGOL 68 (1968) представил комплексные возможности выделения подпоследовательностей и обрезки многомерных массивов. Функции выделения подпоследовательностей массивов были включены в несколько современных языков, таких как Ada 2005, Cobra, D, Fortran 90, Go, Rust, Julia, MATLAB, Perl, Python, S Lang, Windows PowerShell и математические/статистические языки GNU Octave, S и R.