
- •Содержание
- •Введение
- •1. Cтруктуры данных и алгоритмы
- •1.1. Понятие структур данных и алгоритмов
- •1.2. Информация и ее представление в памяти
- •1.2.1. Природа информации
- •1.2.2. Хранение информации
- •1.3. Системы счисления
- •1.3.1. Непозиционные системы счисления
- •1.3.2. Позиционные системы счисления
- •1.3.3. Изображение чисел в позиционной системе счисления
- •1.3.4. Перевод чисел из одной системы счисления в другую
- •1.4. Классификация структур данных
- •1.5. Операции над структурами данных
- •1.6. Структурность данных и технология программирования
- •2. Простые структуры данных
- •2.1. Числовые типы
- •2.1.1. Целые типы
- •2.1.2. Вещественные типы
- •1). Число 15.375;
- •2). Десятичное число 0.0375;
- •3). Десятичное число 2.5;
- •4). Значения верхней и нижней границ диапазона положительных чисел:
- •1). Число -15.375;
- •2). Число 1.0;
- •3). Значения верхней и нижней границ диапазона положительных чисел
- •2.1.3. Десятичные типы
- •2.1.4. Операции над числовыми типами
- •2.2. Битовые типы
- •2.3. Логический тип
- •2.4. Символьный тип
- •2.5. Перечислимый тип
- •2.6. Интервальный тип
- •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. Множества
- •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.8.4. Сортировки слиянием.
- •4. Полустатические структуры данных
- •4.1. Характерные особенности полустатических структур
- •4.2. Стеки
- •4.2.1. Логическая структура стека
- •4.2.2. Машинное представление стека и реализация операций
- •4.2.3. Стеки в вычислительных системах
- •4.3. Очереди fifo
- •4.3.1. Логическая структура очереди
- •4.3.2. Машинное представление очереди fifo и реализация операций
- •4.3.3. Очереди с приоритетами
- •4.3.4. Очереди в вычислительных системах
- •4.4. Деки
- •4.4.1. Логическая структура дека
- •4.4.2. Деки в вычислительных системах
- •4.5. Строки
- •4.5.1. Логическая структура строки
- •4.5.2. Операции над строками
- •4.5.3. Представление строк в памяти.
- •5. Динамические структуры данных. Связные списки
- •5.1. Связное представление данных в памяти
- •5.2. Связные линейные списки
- •5.2.1. Машинное представление связных линейных списков
- •5.2.2. Реализация операций над связными линейными списками
- •5.2.3. Применение линейных списков
- •5.3. Мультисписки
- •5.4. Нелинейные разветвленные списки
- •5.4.1. Основные понятия
- •5.4.2. Представление списковых структур в памяти.
- •5.4.3. Операции обработки списков
- •5.5. Язык программирования lisp
- •5.6. Управление динамически выделяемой памятью
- •6. Нелинейные структуры данных
- •6.1.Графы
- •6.1.1. Логическая структура, определения
- •6.1.2. Машинное представление оpгpафов
- •6.2. Деревья
- •6.2.1. Основные определения
- •6.2.2. Логическое представление и изображение деревьев.
- •6.2.3. Бинарные деревья.
- •6.2.4. Представление любого дерева, леса бинарными деревьями.
- •6.2.5. Машинное представление деревьев в памяти эвм.
- •6.2.6. Основные операции над деревьями.
- •6.2.7. Приложения деревьев.
- •6.2.8 Деревья Хаффмена (деревья минимального кодирования)
- •6.2.9 Деревья при работе с арифметическими выражениями
- •6.2.10 Формирование таблиц символов.
- •6.2.11 Сбалансированные деревья
3.3. Множества
Логическая структура.
Множество - такая структура, которая представляет собой набор неповторяющихся данных одного и того же типа. Множество может принимать все значения базового типа. Базовый тип не должен превышать 256 возможных значений. Поэтому базовым типом множества могут быть byte, char и производные от них типы.
Физическая структура.
Множество в памяти хранится как массив битов, в котором каждый бит указывает является ли элемент принадлежащим объявленному множеству или нет. Т.о. максимальное число элементов множества 256, а данные типа множество могут занимать не более 32-ух байт.
Число байтов, выделяемых для данных типа множество, вычисляется по формуле: ByteSize = (max div 8)-(min div 8) + 1, где max и min - верхняя и нижняя границы базового типа данного множества.
Номер байта для конкретного элемента Е вычисляется по формуле:
ByteNumber = (E div 8)-(min div 8),
номер бита внутри этого байта по формуле:
BitNumber = E mod 8
{===== Программный пример 3.3 =====}
const max=255; min=0; E=13;
var S : set of byte;
ByteSize, ByteNumb, BitNumb : byte;
begin
S:=[]; { обнуление множества }
S:=S+[E]; { запись числа в множество }
ByteSize:=(max div 8)-(min div 8)+1;
Bytenumb:=(E div 8)-(min div 8);
BitNumb:=E mod 8;
writeln(bytesize); { на экране 32 }
writeln(bytenumb); { на экране 1 }
writeln(bitnumb); { на экране 5 }
end.
3.3.1. Числовые множества
Стандартный числовой тип, который может быть базовым для формирования множества - тип byte.
Множество хранится в памяти как показано в таблице 3.3.
Таблица 3.3
где @S - адрес данного типа множество.
Бит поля установлен в 1, если элемент входит в множество, и в 0 - если не входит.
Например, S : set of byte; S:=[15,19];
Содержимое памяти при этом будет следующим:
@S+0 - 00000000 @S+2 - 00001000
@S+1 - 10000000 . . . . . .
@S+31 - 00000000
3.3.2. Символьные множества
Символьные множества хранятся в памяти также как и числовые множества. Разница лишь в том, что хранятся не числа, а коды ASCII символов.
Например, S : set of char; S:=['A','C'];
В этом случае представление множества S в памяти выглядит следующим образом :
@S+0 - 00000000 . . . . . .
. . . . . . @S+31 - 00000000
@S+8 - 00001010
3.3.3. Множество из элементов перечислимого типа
Множество, базовым типом которого есть перечислимый тип, хранится также, как множество, базовым типом которого является тип byte. Однако, в памяти занимает место, которое зависит от количества элементов в перечислимом типе.
Пример:
Type
Video=(MDA,CGA,HGC,EGA,EGAm,VGA,VGAm,SVGA,PGA,XGA);
Var
S : set of Video;
В памяти будет занимать :
ByteSize = (9 div 8)-(0 div 8)+1=2 байта
При этом память для переменной S будет распределена как показано на рис. 3.8.
Рис. 3.8. Распределение памяти для переменной типа set of Video
Если выполнить оператор S:=[CGA,SVGA], содержимое памяти при этом будет:
@S+0 - 10000010
@S+1 - 00000000