- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Массивы Описание массива
Массив объединяет элементы одного типа данных.
Массив характеризуется:
фиксированным набором элементов одного и того же типа;
каждый элемент имеет уникальный набор значений индексов;
количество индексов определяют размерность массива, например, два индекса — двумерный массив, три индекса — трёхмерный массив, один индекс — одномерный массив или вектор;
обращение к элементу массива выполняется по имени массива и значениям индексов для данного элемента.
В языках программирования вектор представляется одномерным массивом с синтаксисом описания вида (Pascal):
< Имя >: array [minInd..maxInd] of < тип >;
где minInd - номер первого элемента, maxInd - номер последнего элемента. Для описания двумерного массива используют следующий синтаксис:
<Имя>: array [minInd1..maxInd1, minInd2..maxInd2] of <тип>
<Имя>: array [minInd1..maxInd1] of array [minInd2..maxInd2] of <тип>
Для работы с массивами чаще всего используются циклы.
Плюсовиспользования массива всего два, но зато больших:
- доступ за константное время к любому элементу;
- память тратится только на данные.
Минус - один, но тоже большой: статичность, неизменность структуры.
Одномерный массив иногда называют вектором.
Замечание: массив следует использовать лишь в том случае, когда для решения задачи необходимо хранение последовательности значений.
Представление массивов в памяти
Элементы вектора размещаются в памяти в подряд расположенных ячейках памяти. Под элемент вектора выделяется количество байт памяти, определяемое базовым типом элемента этого вектора. Размер памяти для хранения вектора определяется произведением количества элементов на число байт для хранения одного элемента.
Представление в памяти вектора будет такое, как показано на рис.1.
@имя |
+0 |
+Sizeof(тип) |
… |
|
+(k-n)* Sizeof(тип) |
|
Имя[n] |
Имя[n+1] |
Имя[k-1] |
Имя[k] |
Рис 1. Представление вектора в памяти
где
@ Имя - адрес вектора или, что тоже самое, адрес первого элемента вектора,
Sizeof(тип) - количество байтов памяти для записи одного элемента вектора,
(k-n)*Sizeof(тип) - относительный адрес элемента с номером k, или, что тоже самое, смещение элемента с номером к.
Например:
var ml : array [-2..2] of real;
представление данного вектора в памяти будет как на рис.2.
Смещение элемента относительно адреса m1 (байт) |
+0 |
+6 |
+12 |
+18 |
+24 |
Значения элементов массива |
m1[-2] |
m1[-1] |
m1[0] |
m1[1] |
m1[2] |
Рис 2. Представление вектора ml в памяти
В языках, где память распределяется до выполнения программы на этапе компиляции (С, Pascal, Fortran), при описании типа вектора граничные значения индексов должны определены. В языках, где память может распределяться динамически (Algol, PL/1), значения индексов могут быть заданы во время выполнения программы.
Многомерные массивы хранятся в непрерывной области памяти. Принцип распределения элементов массива в памяти определен языком программирования. Так в Pascal элементы распределяются - по строкам - изменение индексов выполняется в направлении справа налево.