Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Структуры и алгоритмы / Типы и структуры данных

.pdf
Скачиваний:
153
Добавлен:
23.02.2015
Размер:
451.95 Кб
Скачать

однородность элементов. Примером записи могут служить анкетные данные о работнике предприятия (рис. 4).

325

Иванов

Цех № 5

Мастер

500р.

 

 

 

 

 

Рис. 4. Пример записи, содержащей анкетные данные о сотруднике

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

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

Описанную и определенную запись можно считать простой записью. Для простой записи характерно то, что каждый ее элемент является простым данным или цепочкой простых данных одного и того же типа. Простую запись можно изобразить в виде дерева: корень – имя записи, листья – непосредственно элементы записи (рис. 5).

Общим видом записи является такая запись, в которой каждый ее элемент может быть в свою очередь записью более низкого уровня. Причем каждый элемент такой «низкой» записи также может быть записью следующего уровня. Описанная иерархическая структура записи может содержать произвольное число уровней и поэтому ее можно назвать многоуровневой записью (рис. 6). Очень часто многоуровневую запись представляют в табличном виде, что гораздо удобнее (рис. 7).

13

 

 

 

 

 

Анкета

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таб. номер

 

 

 

ФИО

 

 

Отдел

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Должность

 

 

Тариф

 

 

 

 

 

 

 

 

 

 

 

Рис. 5. Простая запись

Ведомость

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таб. номер

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Квалификация

 

 

Должность

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Разряд

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ФИО

 

 

Фамилия

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Инициалы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Часы

 

 

Штатно

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сверхурочно

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Деньги

 

 

Начисления

 

Оклад

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Надбавки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Премия

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Удержания

 

Налоги

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Взыскания

 

 

 

 

 

 

 

 

Рис. 6. Многоуровневая запись в древовидной форме

14

Ведомость

 

ФИО

Квалификация

Часы

 

 

 

Деньги

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таб. номер

 

 

 

 

 

Сверхурочно

 

Начисления

 

Удержания

Фамилия

Инициалы

Должность

 

Штатно

 

 

 

 

 

 

 

Разряд

Оклад

 

Премия

Надбавки

 

Налоги

Взыскания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7. Многоуровневая запись в табличной форме

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

содержательными элементами.

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

2.2.4. Таблица

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

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

15

таблицу иногда определяют в виде списка пар: T = (K, V), где K – поле ключа, а V – упорядоченный набор полей, предназначенных для хранения любой другой информации. В некоторых случаях необходимо использовать несколько ключей.

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

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

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

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

Алгоритм исключения элемента из таблицы

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

16

1.Установить указатель на первый элемент таблицы.

2.Если элемент таблицы свободен, то перейти к шагу 4.

3.Если ключ проверяемого элемента совпадет с заданным ключом, то перейти к шагу 5.

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

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

Алгоритм включения элемента в таблицу

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

1.Установить указатель на первый элемент таблицы.

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

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

17

2.3. Полустатические структуры

Определение полустатических структур базируется на понятии списка, или списковой структуры.

Списком называется линейно-упорядоченная последовательность элементов данных E(1), E(2), …, E(n), n > 0, причем каждый элемент характеризуется одним и тем же набором полей.

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

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

Например, вектор – это такой последовательный список, в котором каждый элемент – скаляр одного и того же типа.

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

Операции, которые можно выполнить с линейным списком включают, например, следующие:

1.Получить доступ к i-тому элементу (узлу) списка, чтобы проанализировать его и/или изменить содержимое его полей.

2.Включить новый узел непосредственно перед i-м узлом.

3.Исключить i-й узел.

4.Объединить 2 или более линейных списков в один список.

18

5.Разбить линейный список на 2 или более линейных списков.

6.Сделать копию линейного списка.

7.Определить количество узлов в списке.

8.Выполнить сортировку узлов списка в возрастающем или убывающем порядке по некоторым полям в узлах.

9.Найти в списке узел с заданным значением в некотором поле.

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

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

2.3.1. Стек

Стек – это линейный список, в котором все включения и исключения (и обычно всякий доступ) делаются в одном конце списка. Это последовательный список с переменной длиной. Его еще называют «магазин», «очередь» по принципу "LIFO” (последним пришел, первым исключился). Примерами стека являются винтовочный магазин и железнодорожный разъезд для сортировки вагонов (рис. 8).

Логическая структура стека представлена на рис. 9. Каждый из элементов стека E1, E2, …, En может содержать одно или несколько полей данных.

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

19

Вход

 

Выход

 

 

 

Стековый

участок

Рис. 8. Схема железнодорожного разъезда

Свободные слоты

Вершина

стека

 

 

Верхняя граница

 

 

стека

 

 

 

 

 

Указатель стека

 

 

 

 

En

 

Адрес

 

 

 

верхнего

 

En-1

 

элемента

 

 

 

 

 

E3

E2

Нижняя граница

E1

стека

 

Рис. 9. Логическая структура стека

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

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

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

20

Другие операции над стеком – очистка стека и проверка объема стека (то есть проверки числа элементов в стеке).

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

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

Физическая структура стека дополняется дескриптором, в котором содержатся, кроме указателя, имя стека, границы физической структуры в памяти, а также описание элемента (рис. 10).

Дескриптор

ST Имя стека

Адрес верхней границы

Указатель

Адрес нижней границы

Описание элемента

Слоты для элементов стека

Рис.10. Дескриптор стека

21

2.3.2. Очередь

Очередь – такой последовательный список с переменной длиной, включение элементов в который происходит с одной стороны, а исключение элементов – с другой стороны списка. Она функционирует по принципу "FIFO” (первым пришел, первым обслужился). Та сторона очереди, с которой осуществляется добавление элементов, называется хвостом или концом очереди, другая – головой. Для обозначения головы и хвоста организуются два указателя (рис. 11).

A1

A2

. . .

Amax

Слот

Р1

Р2

Рис. 11. Схема простейшей очереди

Для простейшей очереди выделена конечная последовательность ячеек памяти, из которых в каждый момент времени элементами очереди может быть занята лишь часть последовательных слотов. Занятые ячейки заштрихованы. Слоты имеют адреса A1, A2, . . . , Amax. Каждый элемент очереди представляет собой в общем случае запись с одинаковой организацией для всех элементов. Идентификаторы P1 и P2 являются указателями головного элемента очереди и первого свободного слота, следующего за хвостовым элементом.

Основными операциями над очередью являются включение элемента и исключение элемента.

При включении новый элемент заносится в слот, адресуемый указателем Р2, после чего этот указатель должен быть передвинут к следующему («пустому») слоту.

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

22