
Лекции по ТП / структуры данных
.doc
Структуры данных
Структура данных – это совокупность элементов данных, между которыми существуют некоторые отношения, причем элементами данных могут быть простые данные и структуры данных.
Структуру данных можно определить, как
S=(D,R),
где D- множество элементов данных, R-множество отношений (связей) между элементами данных.
Структуры данных создаются путем агрегирования базовых типов данных и присваивания имен этим совокупностям. В качестве простейшего механизма агрегирования в большинстве языков программирования применяется массив (одномерный или многомерный). Массив можно рассматривать как отображение множества индексов (таких, как целые числа 1, 2, …, n) во множество элементов массива. Ссылка на элемент массива обычно состоит из имени массива и значений из множества индексов этого массива.
Другим общим механизмом агрегирования в языках программирования является структура записи. Такая структура очень похожа на одномерный массив, однако ее элементы именуются и могут иметь разный тип данных.
Третьим механизмом агрегирования является структура файла. Первые два механизма агрегирования предназначаются для создания структур данных в оперативной памяти ЭВМ, поэтому структуры типа массива и записи являются структурами с “произвольным доступом”. Под “произвольным доступом” понимается тот факт, что время доступа к элементам массива или записи не зависит от значений индексов массива или указателей имен элементов записи. Файл является структурой с ограниченным доступом, что означает возможность доступа к элементам файла в том порядке, в каком эти элементы заносятся в файл. Однако достоинством агрегирования с помощью файла является отсутствие ограничений на количество составляющих элементов структуры и возможность изменения этого количества в процессе выполнения программы. Далее перечисленные структуры будут рассмотрены более подробно.
Структуру можно изображать в виде графа, при этом элементам данных соответствуют вершины, а связям или отношениям – ориентированные или неориентированные ребра.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
и строгую упорядоченность. Поэтому массив изображают так, чтобы были ясны количество элементов и разбиение на строки и столбцы. Рисунок 1 - Массив
Обобщенная структура в определенном выше смысле без учета ее представления в памяти ЭВМ называется абстрактной или логической. Чаще применяется термин “логическая” и мы тоже будем этот термин применять для структуры данных с точки зрения пользователя или программиста. ЭВМ может обрабатывать только те структуры, которые тем или иным образом представлены в машинной памяти. Такая структура данных называется физической структурой, структурой хранения, внутренней структурой или структурой памяти. Т.о. физическая структура данных отражает способ представления данных в памяти ЭВМ, следовательно, между логической и физической структурой существует различие, которое зависит от особенностей структуры и особенностей организации памяти ЭВМ, в которой структура должна быть размещена. Вследствие этого различия в ЭВМ должны существовать процедуры, осуществляющие отображение логической структуры в физическую и наоборот. Эти процедуры осуществляют доступ к физическим структурам и выполнение над ними различных операций.
Например, доступ к элементу двумерного массива на логическом уровне реализуется указанием номеров строки и столбца. На физическом уровне к элементу массива доступ осуществляется с помощью функции адресации, которая при известном начальном адресе массива в машиной памяти преобразует номер строки и столбца в адрес памяти соответствующего элемента массива.
Выводы:
1. Каждую структуру данных можно характеризовать ее логическими и физическими представлениями, а также совокупностью операций над этими представлениями.
2. Очень часто, говоря о той или иной структуре данных, имеют в виду ее логическое представление, так как физическое представление обычно скрыто от “внешнего наблюдателя”.
3. Логическое представление не зависит от языка программирования и ЭВМ, а физическое представление зависит от трансляторов и ЭВМ. Так, двумерный массив в Фортране и Паскаль представляется одинаково, а физическое представление такого массива в одной и той же ЭВМ - разное.
Прежде чем приступить к изучению конкретных структур данных, дадим им общую классификацию.
В зависимости от отсутствия или наличия явно заданных связей между элементами данных различают структуры несвязные (вектор, массив, строка, стек, очередь) и связные (списки). Важный признак структуры – ее изменчивость. Под изменчивостью будем понимать изменение числа элементов структуры и (или) связей между элементами структуры. По этому признаку различают структуры статические, полустатические и динамические. В зависимости от характера взаимного расположения элементов в памяти ЭВМ структуры делят на структуры данных с последовательным расположением элементов в памяти (вектор, массив, стек, очередь) и структуры с произвольным распределением – (односвязные, двусвязные, ассоциативные списки). Рассмотрим структуры данных подробнее в рамках их классификации по изменчивости.
Статические структуры данных
Этот класс структур характеризуется тем, что для их размещения в памяти ЭВМ выделяется фиксированный объем памяти.
Вектор – конечное упорядоченное множество простых данных или скаляров одного и того же типа. Элементы вектора находятся между собой в отношении непосредственного следования. В памяти ЭВМ элементы вектора представляются последовательностью одинаковых по длине участков памяти, как правило, расположенных в порядке следования элементов в группе. Важнейшая операция над вектором – доступ к заданному элементу. Кроме того, над вектором можно выполнять операции определения верхней и нижней границ индекса. По сути эти операции дают описание вектора.
Массивом называют такой вектор, каждый элемент которого вектор. В свою очередь элементы вектора “вектора массива” могут быть вектором (3-х и более мерные массивы). Процесс последовательного перехода к элементам вектора рано или поздно должен завершиться на скалярном элементе некоторого типа данных, причем этому типу должны соответствовать все скалярные элементы массива. Поэтому может быть более точным является скалярное определение массива:
к-мерным массивом называется конечное упорядоченное множество (к-1) мерных массивов, все элементы которых принадлежат одному и тому же типу. При к=1 получаем вектор.
Как и для вектора, важнейшая операция с массивом – доступ к элементу массива. Эта операция должна учитывать физическое представление массива. Для массива общего вида преобразование логической структуры в физическую выполняется путем процесса линеаризации или упорядочения, в ходе которой многомерная структура массива преобразуется в одномерную физическую структуру. Эта одномерная структура представляет линейно – упорядоченную последовательность элементов массива. Такое преобразование неоднозначно. Например, после линеаризации, элементы двухмерного массива могут быть расположены строка за строкой или столбец за столбцом.
Пусть задан произвольный n-мерный массив
в котором каждая пара величин целого
типа
указывает
нижнюю и верхнюю границы s-того
индекса, где, s=1,2,…n.
Пусть
- произвольный элемент массива В.
Если длина слота (объем памяти, занимаемый
элементом массива) равна d
байт, то следующее выражение позволяет
вычислить адрес произвольного элемента
массива
,
если известен или задан адрес первого
элемента
(адрес начала массива:
ADDR()=
ADDR(
)+d*(
Вышеприведенная формула является не
чем иным, как функцией линеаризации или
упорядочения элементов n-мерного
массива. Величина
в этом выражении зависит от способа
отображения массива В. При отображении
массива строка за строкой (как в Паскале)
определяется следующим рекуррентным
соотношением:
=
,
m=n-1, n-2,…,1,
,
а при отображении массива столбец за столбцом (как в Фортране):
.
В связи с массивом следует упомянуть и такую их разновидность, как разреженные матрицы. Это также массивы, большинство элементов которого равны “0”. К таким матрицам приходят в технике при получении ММ систем.
Для разряженных матриц нет смысла хранить все элементы матрицы, а хранят только ненулевые значения. Подходящей физической структурой такого массива является связный список, о котором мы будем говорить позже.
Запись - конечное упорядоченное множество элементов, характеризующихся в общем случае различным типом данных. Элементы записи называются полями. Другое определение записи – это обобщенный вектор, при котором не требуется однотипность или однородность элементов.
Поскольку запись можно рассматривать как обобщение понятия вектор, то для записи характерной операцией является доступ к полям записи. Аналогично вектору поля записи в памяти ЭВМ располагаются последовательно. Как уже упоминалось выше, поля записи именуются и доступ к ним осуществляется путем указания имени записи и имени поля этой записи. Для организации доступа в ЭВМ, как правило, создается дескриптор записи, в котором указывается смещение начала поля записи относительно начала записи в целом.
Например, запись:
ЗАП
-
личный N студента, целое 2-значное;
-
ФИО – символьное 15 – значное;
-
Аббревиатура факультета – символьное 4-значное,
может иметь следующий дескриптор:
ЗАП
Личный номер студента 0
ФИО 2 (целое занимает 2 байта)
Факультет 17 (1-символ – 1байт)
Таблица - конечное упорядоченное множество записей, имеющих одну и ту же организацию. Наиболее распространена форма таблицы, в которой элемент представляет собой одноуровневую запись, состоящую из упорядоченной последовательности полей, имеющих в общем случае различный размер и соответствующих различным типам простых данных. Логическая структура представляется в виде последовательности расположенных друг под другом строчек одинаковой длины представляющих элементы таблицы и разделенных на графы. Обычно одно из полей всех элементов таблицы отводится для хранения ключа, являющегося уникальным для каждого записи таблицы. Иногда ключом записи таблицы является некоторая совокупность полей записи. Тогда говорят, что ключ записи – сцепленный. Иногда таблицы определяют в виде совокупности (k,v), где k-поле ключа (сцепленного или простого), v- набор остальных полей записи (неключевых).
Таблица представляет собой обобщение понятия двумерного массива, в которой свойство однотипности элементов массива требуется лишь для элементов, расположенных в одном и том же столбце. Доступ к записям таблицы может осуществляться по номеру записи (аналог номера строки в двумерном массиве), но чаще доступ осуществляется по ключу, причем целью доступа является получение не отдельного поля записи, а как правило, сначала ищется какая-то одна запись (или группа записей), а затем осуществляется обработка полей этой записи или группы записей.
Отличие массива от таблицы: доступ осуществляется не с помощью индексов, а по ключу, и целью доступа служит не отдельное данное, а запись.
Физические структуры таблицы представляет собой линейную последовательность ячеек памяти, число которых определяется числом и размером полей записей в таблице и числом записей в таблице. Адресом таблицы является адрес первого поля первого поля первой записи таблицы. Область памяти отводится для таблицы в момент ее создания и в дальнейшем размер этой области обычно не изменяется.
Типичные операции над таблицей: включение в таблицу новой записи, поиск записи по заданному ключу с целью доступа и обработки полей записи и исключение записи из таблицы.
Когда таблица не велика, применяется последовательный просмотр таблицы для поиска заданной или свободной записи. Когда таблица большая применяют более изощренные способы поиска, чтобы избежать просмотра всей таблицы и ускорить поиск.
На основе таблиц (отношений) строится реляционная база данных.
О
Внешняя
память Оперативная
память ФАЙЛ ЗАПИСЬ
Поле записи
Рисунок 2 – Выделение элементов иерархии файл-запись-поле записи в памяти ЭВМ
Как следует из рисунка, поле записи можно выделить лишь в оперативной памяти, тогда как файл существует только во внешней памяти. Запись, находящаяся на промежуточном уровне иерархии может быть выделена как в оперативной, так и во внешней памяти. Поэтому запись представляет собой минимальную единицу информации в операциях передачи данных между основной (оперативной) и внешней памятью.
Следует помнить, что запись здесь понимается как логическая запись, которая совпадает с введенным ранее понятием. Логическая запись представляет собой единицу информации, с которой имеет дело программа обработки информации.
Минимальная единица информации, которая может быть передана между основной и внешней памятью, называется физической записью или блоком. Размещение информации на внешнем носителе можно проиллюстрировать следующим рисунком:
Запись1 Запись2 Запись3
Межблочный промежуток
Рисунок 3- Размещение физических записей на внешнем носителе
Существует так называемый фиксированный формат записи, при котором все физические записи имеют одинаковую длину. При этом физическая запись может либо совпадать с логической записью, либо нет. При малой длине логической записи физические записи тоже будут малы, что приведет к неэффективному использованию внешней памяти, так как данные будут занимать объем, сравнимый с объемом межблочных промежутков (эта часть не используется для хранения информации). Чтобы использование внешней памяти было эффективным, логические записи блокируют, иначе говоря, в физический блок записывают несколько логических записей, например, как показано на рисунке 4.
Зап1 Зап2 Зап3 Зап1 Зап2 Зап3
Межблочный промежуток
Рисунок 4 – Сблокированные логические записи
Информация на накопителях на жестких магнитных дисках (дискетах) – НГМД размещается на концентрических окружностях поверхности дисках, называемых дорожками. Логическая структура магнитного диска показана на рисунке 5 , а формат дорожки показан на рисунке 6.
На рисунке 6 ДМП – домаркерный промежуток, МНД – маркер начала дорожки, ПМП – послемаркерный промежуток. Маркер – это определенный идентифицирующий код. Перечисленные элементы информации на дорожке являются служебными и не содержат собственно информацию пользователя. Хранимая на диске информация записывается в элементы, называемые секторами.
дорожка
сектор
кластер
Рисунок 5 – логическая структура магнитного диска
ДМПдд МНД ПМП Сектор1 Сектор2
Рисунок 6. Формат дорожки НГМД
В одном секторе дорожки обычно размещается
512 байт данных. Обмен данными между НГМД
и ОП осуществляется последовательно
кластерами, содержащими целое число
секторов, причем кластер содержит
количество секторов, кратное
.
Кластер – это минимальная единица
размещения информации на диске, состоящая
из двух или большего количества смежных
секторов дорожки (кластеры называют
также единицами размещения памяти
–allocation unit).
Поэтому, если необходимо разместить на
диске маленький файл размером, например,
20 байт, он все равно займет дисковое
пространство размером в кластер (минимум
2*512= 1024 байт). Обратите внимание: в кластер
включаются смежные сектора, а вот
кластеры, выделяемые одному файлу, могут
находиться в любом свободном месте
дисковой памяти и вовсе не обязаны быть
смежными. Файлы, хранящиеся в разбросанных
по диску кластерах, называются
фрагментированными.. Ниже, на рисунке
7 приведен формат сектора.
МС ДИП МД Данные КК ПИП
Рисунок 7 – Формат сектора дорожки
На рисунке 7 обозначено:
-
МС – маркер сектора;
-
ДИП – доинформационный промежуток;
-
МД - маркер данных;
-
КК- контрольные коды;
-
ПИП – послеинформационный промежуток.
Контрольные коды вводятся для контроля считывания. Все упоминаемые промежутки заполняются нулевыми байтами и используются для создания временных интервалов при чтении-записи, необходимых системе управления. На рисунке 8 приводится формат маркера сектора.
АМ АД НС АС КК
Рисунок 8 – формат маркера сектора
Маркер сектора содержит:
-
АМ- адресный маркер;
-
АД – адрес дорожки;
-
НС – номер стороны дискеты;
-
АС – адрес сектора на дорожке;
-
КК – контрольные коды.
При работе с файлами следует помнить, что в операциях ввода-вывода используются буферы – области оперативной памяти объемом не менее минимальной единицы обмена, т,е. кластера.
Записи из файлов на НГМД можно обрабатывать последовательно (от первой до последней записи) или в произвольном порядке (такой доступ называют прямым). При последовательном доступе осуществляется автоматическое блокирование и деблокирование логических записей. Для этого в ОП создаются одна или несколько буферных областей , в которых и происходит блокирование и деблокирование записей. Управление вводом-выводом осуществляется каналами ввода –вывода параллельно (одновременно) с выполнением программы. При этом ввод-вывод управляется операционной системой (ОС), и ОС “знает”, какая очередная запись может потребоваться программе обработки, поэтому может подготовить требуемую запись заранее, что увеличивает скорость обработки.
При прямом доступе обращение производится непосредственно к нужному блоку данных. Как правило, поиск осуществляется по значению ключа (на логическом уровне). Чтобы найти запись на физическом уровне, нужно по значению ключа определить физический адрес записи. Эту процедуру возлагают либо на функции ОС, либо программист реализует эту процедуру в своей программе обработки, что, несомненно, усложняет программу обработки. Поскольку в этом случае порядок поступления записей на обработку не регламентируется, то нет возможности подготовить заранее следующую запис для обработки.
На каждом диске можно выделить две области - системную и данных. В системной области диска (начинается с 0 дорожки, 0 стороны, сектора 1) размещены 3 зоны, содержащие:
-
главную загрузочную запись (MRB – Main Boot Record), в которой описывается конфигурация диска: какой раздел (логический диск) является системным, сколько разделов на этом диске и какого они объема;
-
таблицу размещения файлов FAT (File Allocation Table) , в которой отмечаются кластеры, выделенные для файла. Кластеры, в которых размещены физически последовательные записи файла, имеют последовательные номера. Эта таблица является очень важной, при ее порче чтение записей файла становится невозможным, поэтому такая таблица для каждого файла в системной области внешней памяти дублируется;
-
корневой каталог диска - список файлов и/или подкаталогов с их параметрами: расширением, размером в байтах,, датой и временем создания и номером начального кластера. В этом начальном и следующих кластерах в таблице FAT указываются номера следующих кластеров, занимаемых файлом. Последний кластер файла имеет номер-код FFFF.