Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Program_Lec.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
615.42 Кб
Скачать

Операции над структурами и типы структур данных

В процессе функционирования АИС записи и массивы записей претерпевают различного рода изменения. В информационные массивы добавляются новые записи, удаляются устаревшие записи. Процесс поддержания информационного массива в актуальном состоянии, заключающийся в добавлении и удалении записей, называется ведением.

Значения свойств объектов могут со временем изменяться и в записи об этих объектах необходимо вносить соответствующие изменения. Процесс внесения изменений в поля записей называется корректировкой.

Для добавления, удаления или корректировки, для обработки информации, содержащейся в записях, прежде всего, необходимо найти нужную запись. Поэтому операция поиска является наиболее важной операцией для АИС. Поиск записей должен выполняться как можно быстрее, так как время поиска в значительной мере определяет общее время обработки информации.

Т. о. добавление, удаление, корректировка, поиск – это основные операции, выполняемый над структурами данных. Скорость выполнения этих операций определяет скорость обработки данных.

Существуют различные типы структур данных.

Различают линейные структуры и нелинейные структуры данных.

В линейных структурах между записями можно установить связи, которые определяют отношения между объектами типа "следующий", "предыдущий", "первый", "последний". Эти связи не содержат в себе никаких условий (например, список студентов). К линейным структурам данных относятся: массив, стек, очередь, таблица.

В реальном мире между объектами обычно существуют такие отношения, которые невозможно отобразить с помощью линейных структур. В этих случаях строят нелинейные структуры данных. В нелинейных структурах, в отличие от линейных, связь между элементами структуры (записями) определяется отношениями подчинения или какими-либо логическими условиями. К числу нелинейных структур принадлежат древовидные (иерархические) и графовые (сетевые) структуры.

Структуры могут быть фиксированного и переменного размера. Структуры фиксированного размера после создания не позволяют включать или исключать элементы. В них возможна лишь корректировка записей. К структурам переменного размера можно применять операции добавления и удаления записей.

Различают структуры данных и предоставляемым доступом к данным. В одних структурах доступ возможен к любому элементу. Это структуры с произвольным доступом. В других структура доступ возможен только к строго определенному элементу. Это структуры с ограниченным доступом.

Структуры могут быть однородными и неоднородными. В однородных структурах все элементы представлены записями одного типа. В неоднородных структурах могут присутствовать элементы разных типов.

3. Способы размещения данных в памяти эвм

Последовательное представление данных в памяти ЭВМ

В памяти ЭВМ данные могут иметь последовательное представление или связанное представление.

При последовательном представлении данные в памяти машины размещаются в соседних последовательно расположенных ячейках. При этом физический порядок следования записей должен полностью соответствовать их логическому порядку, т.е. логическая структура данных поддерживается физическим порядком следования данных. Совокупность записей, размещенных в последовательно расположенных ячейках памяти, называют последовательным списком.

Пример: список студентов в журнале.

Для хранения структуры данных в виде последовательного списка в памяти выделяется блок свободных ячеек под максимально ожидаемый размер массива.

Пусть записи имеют следующий логический порядок: Зап. В, Зап. А, Зап. F, Зап. С, …., Зап.N. Эти записи разместятся в памяти ЭВМ так, как это показано на рис. Если записей окажется меньше, чем предполагалось, то память останется неиспользованной. Это – первый недостаток последовательного списка.

В процессе ведения последовательного списка записи добавляются и удаляются. Новые записи добавляются в конец списка. Так запись N+1 поместится в ячейку 100+(N+1). Если количество новых записей окажется больше, чем число свободных ячеек в зарезервированном блоке, то эти записи не удастся разместить. Это второй недостаток последовательного списка.

При удалении записей в памяти остаются свободные ячейки. Если, например, удалить Зап. А и Зап. F, то ячейки 102 и 103 окажутся свободными. Список, в котором содержатся свободные ячейки, называется неплотным.

Со временем значительное число ячеек могут оказаться свободными. Для того, чтобы эти участки памяти не пустовали, весь массив записей время от времени перезаписывается. При этом все записи передвигаются, и список уплотняется. Для перезаписи списка требуется дополнительное машинное время. Это третий недостаток последовательного списка.

В процессе корректировки записи, подлежащие обновлению, читаются из списка и в них вносятся нужные изменения. Скорректированные записи записываются в коней списка в свободные ячейки. Старые записи считаются удаленными.

Последовательное представление данных используется обычно для хранения линейных структур данных в тех случаях, когда предельный объем данных можно предсказать. Под этот объем и резервируется блок памяти.

Последовательное представление наиболее просто реализуется программно.

Связанное представление данных в памяти ЭВМ

Обычно в АИС данные часто обновляются, корректируются и при использовании последовательного представления много машинного времени тратится на перезапись данных в процессе уплотнения списка. Для ряда задач последовательное представление данных является вообще неприемлемым. В таких случаях используют связанное представление данных.

При связанном представлении в каждой записи предусматривается дополнительное поле, в которое помещается указатель (ссылка). Физический порядок следования записей в этом случае может не соответствовать логическому порядку. В памяти ЭВМ записи располагаются в любых свободных ячейках и связываются между собой указателями так, чтобы поддерживался нужный логический порядок. Указатель записи указывает на ячейку памяти, в которой хранится следующая запись. В качестве указателя обычно используется адрес ячейки.

Структуры хранения, основанные на связанном представлении, называются связанными списками. Если каждая запись содержит лишь один указатель, то список называется односвязным, при большем числе указателей список называют многосвязным.

Пусть, в соответствии с решаемой задачей, записи должны иметь следующий логический порядок: Зап. A, Зап. B, Зап. C, Зап. F. В этом порядке они должны читаться и обрабатываться программой. При размещении в памяти Зап. A заняла ячейку 01, Зап. B – ячейку 05, Зап. C- ячейку 03, а Зап. F – ячейку 10. Для того, чтобы обеспечить необходимый логический порядок следования записей в поле указателя каждой записи необходимо поместить адрес ячейки с логически следующей записи. Указатель обозначим АС.

Одна из ячеек, называемая головной, содержит указатель на ячейку с первой записью списка. В соответствии с этим указателем при обработке списка первым будет прочитано содержимое ячейки с адресом 01 , т.е. Зап.А. Затем прочитается содержимое ячеек 05 (Зап. В), 03 (Зап. С) и 10 (Зап. F). Символ , помещенный в поле указателя последней записи списка, означает конец списка. В качестве указателя конца списка может быть использован любой элемент данных, который программой чтения не воспринимается как указатель.

Связанное представление обеспечивает широкие возможности для манипулирования данными и большую гибкость структуры хранения. Удаление и добавление записей в процессе ведения связанного списка не требует перезаписи элементов списка, необходимо лишь изменить соответствующие указатели.

Указатели изменяются таким образом, чтобы сохранялся логический порядок следования записей.

При выполнении операции удаления исключаемая запись удаляется из списка со всеми своими полями, в том числе и с полем указателя. При этом цепочка указателей разрушается, и доступ к следующим записям списка становится невозможным. Указатель записи, логически предшествующей исключаемой, называется висящим, т.к. он указывает на несуществующую запись и цепочка записей на нем обрывается. Для того, чтобы список не разрушался, перед удалением записи следует произвести замену указателей. При этом значение указателя исключаемой записи заносится в поле указателя логически предшествующей записи.

Исключим из списка Зап.С, хранящуюся в ячейке с адресом 03 и имеющую адрес связи 10. Для этого значение указателя предшествующей записи (Зап.В) изменим на АС 10. Теперь доступ к Зап.С стал невозможен и эта запись оказалась исключенной из списка. Освободившаяся ячейка может быть использована для включения новой записи.

Для добавления в односвязный список новой записи берется любая свободная ячейка. В ее информационное поле размещается новая запись, а в поле указателя заносится адрес связи логически предшествующей записи. Адрес ячейки с новой записью становится указателем логически предшествующей записи. Так как для размещения новых записей могут использоваться любые свободные ячейки, список может расти неограниченно и предварительного резервирования памяти под список не требуется.

Включим в список Зап. D, логически следующую за записью С. Зап. D разместим в ячейке с адресом 15. После замены указателей установится следующий порядок чтения ячеей памяти 01, 05, 03, 15, 10, а список будет обрабатываться так: Зап.А, Зап. В, Зап. С, Зап. D, Зап. F.

Односвязный список можно организовать в виде замкнутого кольца.

В этом случае указателем последней записи будет адрес ячейки с первой записью. Такой список называют циклическим. Просмотр такого списка можно начинать с любой ячейки. Условием окончания просмотра может быть совпадение числа обработанных записей с общим числом записей списка, либо совпадение текущего указателя с адресом первой прочитанной ячейки. В последнем случае адрес первой прочитанной ячейки должен запоминаться и при чтении каждой очередной записи сравниваться с ее указателем.

Связанное представление данных используется для хранения нелинейных структур данных, а также для хранения данных в тех случаях, когда:

- заранее неизвестен предельный объем информационного массива;

- информационный массив часто подвергается изменениям и записи часто добавляются и удаляются.

Следует, однако, помнить, что связанное представление приводит к дополнительному расходу памяти из-за появления в записи дополнительного поля – поля указателя.

В некоторых задачах необходимо иметь возможность продвижения по списку в обоих направлениях. Для этого в каждый элемент списка вводится дополнительный указатель, задающий продвижение по списку в обратном направлении. Такой список называется двунаправленным. В поле обратного указателя заносится адрес ячейки с логически предшествующей записью. Головная ячейка в этом случае должна содержать указатели на первую и последнюю ячейки списка. Обработку двунаправленного списка можно начинать как с начала, так и с конца списка.

Для реализации связанного списка язык программирования должен располагать данными типа «указатель». Такой тип данных предусмотрен в языках ПЛ/1, СИ, Паскаль. В языке Паскаль с помощью особых типов данных - указателей можно осуществлять динамическое распределение памяти и создавать динамические структуры данных.

Если таких данных в языке нет, то связанный список можно смоделировать с помощью структуры массива.

Пусть структура данных определена как массив М(I), где данные хранятся в следующем порядке: Зап. С, Зап. D, Зап.В, Зап. А. Таков физический порядок записей. Пусть необходимо обеспечить следующий порядок чтения или обработки записей: Зап. А, Зап.В, Зап. С, Зап. D, не совпадающий с физическим порядком их следования. Для решения этой задачи можно организовать вспомогательный вектор указателей N(J). Элементы вектора – целые числа – определяют порядковые номера (индексы) записей основного массива М(I). При обработке основного массива вначале читается элемент вспомогательного вектора N(J), а затем следует обращения к тому элементу основного массива, индекс которого хранится в этом элементе вектора, т.е. индекс обрабатываемого элемента основного массива I=N(J).

Вектор N(J), изображенный на рис. Задает следующий порядок чтения записей основного массива: Зап. А, Зап. В, Зап. С, Зап. D.

Можно использовать другой прием моделирования связанного списка без использования данных типа указатель. В массиве, моделирующем связанный список, для каждого элемента списка отводится два элемента массива. В первом элементе пары хранится запись списка, а во втором элементе – номер (индекс) того элемента массива, в котором хранится следующая запись списка.

В файлах функции указателя может с успехом выполнять N физической записи. ОС обеспечивает прямой доступ к записи с указанным номером, т.е. к очередной записи связанного списка.

Способ хранения, основанный на преобразовании

ключа записи в ее адрес

Способы размещения данных в памяти, основанные на преобразовании ключа записи в ее адрес, обеспечивают прямой доступ к данным по значению ключа. Адрес хранения записи в этом случае определяется с помощью некоторой процедуры, выполняемой над ключом записи или над кодом записи. Время обращения к любой записи при таком способе хранения не зависит от места расположения записи в памяти.

Способ размещения по вычисляемому адресу используется для размещения данных как в основной памяти – таблицы с прямым доступом, так и при хранении данных на ВЗУ – файлы с прямым доступом.

Для вычисления адресов используются различные процедуры, выполняющие линейные или нелинейные преобразования ключа записи или ее кода. В результате преобразования может определяться физический адрес записи, индекс элемента массива, содержащего запись, номер записи в файле.

Функция, выполняющая процедуру над ключом и генерирующая адрес записи, называется функцией преобразования. В литературе по обработке данных такие функции часто называют рандомизирующими функциями (от англ. random accessпроизвольный доступ). Основное требование, предъявляемое к функции преобразования, состоит в том, что она должна генерировать уникальный адрес для каждой записи.

При выборе функции преобразования оценивается характер данных.

В тех случаях, когда все записи информационного массива имеют

-фиксированную длину,

-уникальные последовательные значения ключа,

-диапазон возможных значений ключа не превышает диапазона адресов доступной памяти,

можно подобрать линейную функцию, обеспечивающую однозначность преобразования ключа в адрес хранения записи с этим ключом.

Пусть, например, необходимо разместить в ОП 50 записей фиксированной длины, ключи которых принимают значения от 0201 до 0250. Диапазон значений ключа – 50. Для хранения записей используем структуру массива. Объявим массив на 50 элементов. Таким образом выделим для хранения записей адреса с1 по 50.

В этом случае для вычисления адресов (индексов массива) можно использовать следующее преобразование:

ai = ki - p

Здесь ki - значение ключа записи; ai – адрес записи, т.е. индекс элемента массива, в котором размещена запись с ключом ki; Р – некоторое положительное число.

Выберем Р = 200. Тогда запись с ключами К=0211 и К=0241 будут занимать соответственно 11 и 41 позиции в массиве. Таким образом, для размещения и последующего обращения к любой записи потребуется значение ее ключа пересчитать в индекс массива, после чего к любой записи возможет прямой доступ из программы.

Реальные данные не всегда удовлетворяют перечисленным условиям, и линейные функции преобразования оказываются непригодными. Так, например, если значения ключа не последовательны и имеют большой разброс значений, то при использовании линейной функции многие ячейки памяти останутся незанятыми. Для вычисления адресов в этих случаях используют более сложные функции преобразования. В большинстве случаев для вычисления адресов оказываются пригодными функции хеширования или хеш-функции. Это название происходит от англ. глагола to hash (нарезать, крошить, делать месиво). Хеш-функция хеширует, т.е. крошит на мелкие кусочки и определенным образом их перемешивает последовательность цифр или битов, определяющих значение ключа записи или ее кода. В результате получается адрес ячейки памяти, где будет размещена эта запись.

Рассмотрим, как работает функция хеширования, преобразующая ключ по методу свертки. Эта функция разбивает ключ на несколько частей, которые затем суммируются таким образом, чтобы сформировалось число в требуемом диапазоне (в диапазоне допустимых значений адресов). Пусть, например, записи имеют восьмиразрядные ключи К1=97434658 и К2=31269857, которые необходимо преобразовать в трехразрядные адреса. Эту задачу можно решить, выполнив следующие операции:

h (97434658) = 974 + 346 + 58 = 378

h (31269857) = 312 + 698 + 57 = 067

Здесь символ h означает, что обработку ключа выполняет хеш-функция. Для того чтобы вычисляемые адреса были трехразрядными, сложение производится по модулю 1000. Результатом сложения по mod 1000 является остаток от деления суммы на 1000.

Функция хеширования должна удовлетворять следующим требованиям:

- вычисляемые адреса должны быть уникальными;

- функция должна обеспечивать однозначное преобразование ключа записи в ее адрес (данному ключу всегда должен соответствовать один и тот же адрес);

- необходимо, чтобы полученные адреса возможно более равномерно распределялись по памяти;

- хеш-функция не должна быть слишком сложной, т.к. время, необходимое для преобразования, добавляется ко времени выполнения операций ведения, поиска или обработки.

Хорошей считается такая хеш-функция, которая быстро генерирует уникальные и достаточно равномерно распределенные адреса.

Известны различные хеш-функции, каждая из которых дает хорошие результаты при конкретном распределении значений ключа. Но даже самая лучшая хеш-функция не исключает возможность получения одинаковых адресов для разных значений ключа. Почти неизбежны ситуации, когда различные записи получают один и тот же адрес. Такая ситуация называется коллизией.

Рассмотрим, как одна из наиболее распространенных функций хеширования, основанная на методе деления, приводит к возникновению коллизий.

Эта функция имеет следующий вид:

h (K) = K mod m + 1.

Здесь m – делитель. Для вычисления h(K) ключ записи К делится на m и остаток от деления, равный K mod m, увеличивается на 1.

Выберем m = 101 и выполним преобразования h (K) над ключами 2000, 2001, …, 2017. Получатся адреса 82, 83, , 99. Теперь рассчитаем адреса записей для ключей 3313,.3314, …, 3330. Получим те же самые адреса, т.е. возникает коллизия.

Существуют различные методы разрешения коллизий.

При использовании одного из них хеш-адрес, вступивший в коллизию, подвергается рехешированию, заключающемуся в определенном преобразовании этого адреса. Например, полученный адрес может быть умножен на константу, в результате чего будет получен новый адрес. Подобные преобразования могут выполняться неоднократно до тех пор, пока не будет сгенерирован адрес свободной ячейки памяти. При поиске записи будет выполняться та же последовательность преобразований.

Другой метод разрешения коллизий заключается в использовании сгенерированного адреса в качестве начальной точки для дальнейшего последовательного просмотра ячеек памяти. Начиная с этого адреса, производится поиск свободного места в памяти, куда размещается запись, вступившая в коллизию

На практике наиболее часто используется следующий прием, позволяющий разрешать коллизии. Адрес, генерируемый рандомизирующей процедурой, считается при этом адресом хранения не одной конкретной записи, а адресом области памяти, или страницы памяти.

Страница 01

К

Страница

Страница 02 переполнения

А

N

Страница N ……..

В пределах этой страницы размещаются все записи, получившие этот адрес. На странице записи могут располагаться последовательно в порядке поступления или в соответствии с каким-либо установленным логическим порядком. Если со временем основная страница окажется заполненной, в памяти выделяется новая страница – страница переполнения, которая связывается с основной страницей указателем.

При поиске и удалении записи над ключом выполняются такие же преобразования, которые выполнялись при размещении записи. Если на основной странице нужной записи не оказалось, то просматривается страница переполнения.

Хеш-функция может генерировать или физический адрес страницы памяти А, или ее номер N. В последнем случае создается справочник, в котором указаны номера страниц и соответствующие им физические адреса ОП или ВП.

При редактировании записи в неё вносятся необходимые изменения, и запись размещается по прежнему адресу. Если редактируется ключевое поле, то адрес вновь вычисляется и запись размещается по новому адресу.

Для обеспечения прямого доступа к записям из прикладных программ с помощью функции преобразования вычисляться может не только адрес хранения записи, но и индекс элемента массива с нужной записью или порядковый номер записи в файле.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]