
- •Cтруктуры данных и алгоритмы
- •Понятие структур данных и алгоритмов
- •1.2. Алгоритм Евклида
- •1.3. Классификация структур данных
- •1.4. Операции над структурами данных
- •1.5. Структурность данных и технология программирования
- •2. Простые структуры данных
- •2.1. Числовые типы
- •2.1.1. Целые типы
- •2.1.1.1. Перевод чисел из одной системы счисления в другую
- •2.1.2. Вещественные типы
- •2.1.3. Десятичные типы
- •2.1.4. Операции над числовыми типами
- •2.2. Битовые типы
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечислимый тип
- •2.6. Интервальный тип языкаPascal
- •2.7. Указатели
- •2.7.1. Физическая структура указателя
- •2.7.2. Представление указателей в языках программирования
- •2.7.3. Операции над указателями
- •3. Статические структуры данных
- •3.1. Векторы
- •3.2. Массивы
- •3.2.1. Логическая структура
- •3.2.2. Физическая структура
- •3.2.3. Операции
- •3.2.4. Адресация массивов с помощью векторов Айлиффа
- •3.2.5. Специальные массивы
- •3.3. Множества ( в языкеPascal )
- •3.3.1. Числовые множества
- •3.3.2. Символьные множества
- •3.3.3. Множество из элементов перечислимого типа
- •3.3.4. Множество от интервального типа
- •3.3.5. Операции над множествами
- •3.4. Записи
- •3.4.1. Логическое и машинное представление записей
- •3.4.2. Операции над записями
- •3.5. Записи с вариантами
- •3.6. Таблицы
- •3.7. Операции логического уровня над статическими структурами. Поиск
- •3.7.1. Последовательный или линейный поиск
- •3.7.2. Бинарный поиск
- •3.8. Операции логического уровня над статическими структурами. Сортировка
- •3.8.1. Сортировки выборкой
- •3.8.2. Сортировки включением
- •3.8.3. Сортировки распределением
- •3.9. Прямой доступ и хеширование
- •3.9.1. Таблицы прямого доступа
- •3.9.2. Таблицы со справочниками
- •3.9.3. Хешированные таблицы и функции хеширования
- •3.9.4. Проблема коллизий в хешированных таблицах
- •Библиографический Список
- •Оглавление
3.2. Массивы
3.2.1. Логическая структура
Массив - такая структура данных, которая характеризуется:
фиксированным набором элементов одного и того же типа;
каждый элемент имеет уникальный набор значений индексов;
количество индексов определяет мерность массива, например, два индекса - двумерный массив, три индекса - трехмерный массив, один индекс - одномерный массив или вектор;
обращение к элементу массива выполняется по имени массива и значениям индексов для данного элемента.
Другое определение: массив - это вектор, каждый элемент которого - вектор.
Синтаксис описания массива представляется в виде:
<Тип> <Имя>[n1] [n2] .. [nn];
Для случая двумерного массива:
<Тип> <Имя>[n1] [n2]
Наглядно двумерный массив можно представить в виде таблицы из n1 строк и n2 столбцов.
3.2.2. Физическая структура
Физическая структура - это размещение элементов массива в памяти ЭВМ. Для случая двумерного массива, состоящего из (n) строк и (k) столбцов, физическая структура представлена на рис. 3.3.
@Mas
|
+0 ┌──┴──┐ |
+Sizeof(тип) ┌──┴──┐ |
|
+(k-1)* Sizeof(тип) ┌──┴──┐ |
|
Mas[0][0]
|
Mas[0][1] |
… |
Mas[0][k-1] |
|
…
|
… |
|
… |
|
Mas[n-1][0]
|
Mas[n-1][1] |
… |
Mas[n-1][k-1] |
|
+k*(n-1)* Sizeof(тип) или *(Mas+n-1) |
+(k*(n-1)+1)* Sizeof(тип) или *(*(Mas+n-1)+1) |
|
+(k*(n-1)+(k-1))* Sizeof(тип) или *(*(Mas+n-1)+k-1) |
Рис. 3.3. Физическая структура двумерного массива из
(n) строк и (k) столбцов
Многомерные массивы хранятся в непрерывной области памяти. Размер слота определяется базовым типом элемента массива. Количество элементов массива и размер слота определяют размер памяти для хранения массива. Принцип распределения элементов массива в памяти определен языком программирования. Так, в FORTRAN элементы распределяются по столбцам - так, что быстрее меняются левые индексы, в PASCAL - по строкам - изменение индексов выполняется в направлении справа налево.
Количество байтов памяти, занятых двумерным массивом, определяется по формуле :
ByteSize = (n)*(k)*SizeOf(Тип) (3.3)
Адресом массива является адрес первого байта начального компонента массива. Смещение к элементу массива Mas[i1][i2] определяется по формуле:
ByteNumber = [ i1* k + i2 ]*SizeOf(Тип) (3.4)
его адрес : @ByteNumber = @mas + ByteNumber = *(*(Mas + i1) + i2)
Например:
short Mas[3][2];
Базовый тип элемента shortтребует два байта памяти, тогда табл. 3.2 смещений элементов массива относительно @Mas будет выглядеть так:
Таблица 3.2
Смещение, байт |
Элемент массива |
Смещениие, байт |
Элемент массива |
+0 |
Mas[0,0] |
+2 |
Mas[0,1] |
+4 |
Mas[1,0] |
+6 |
Mas[1,1] |
+8 |
Mas[2,0] |
+10 |
Mas[2,1] |
Этот массив будет занимать в памяти: 3*2*2=12 байт; а адрес элемента Mas[2,1]: @Mas+( 1*2+1 )*2 = @Mas+6 = *(*(Mas+2) +1)