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

Понятие о структурах данных

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

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

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

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

Второй характеристикой множества является стратегия взаимного расположения элементов данных в области памяти - стратегия адресации.

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

1.1.2. ПОHЯТИЕ О ДАHHЫХ

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

в одном из фиксированных состояний.

Данными называется изображение информации, т.е. описание состояния носителя. С каждым источником информации обязательно связан язык интерпретации - язык преобразования информации в данные и наоборот. Информация всегда активна, а данные - пассивны. Говорят, что данные - это застывшая информация.

Язык интерпретации имеет алфавит: а1, а2, ..., аm. С помощью символов этого

языка сообщение изображается в виде строки символов

S = s1, s2, ..., sN, где si - это некоторые аi. Строка символов разбивается на "слова" (фрагменты). При этом каждое слово изображает атрибут. Именно такое слово называется элементом данных. Элемент данных - это простейшая неделимая конструкция данных как и атрибут - неделимый элемент информации. Строка S называется логическим уровнем представления данных. Если мы будем изображать каждый символ Si в виде определенного состояния (Si) некоторой физической среды, то (Si) можно рассматривать как коды.

Рассмотрим среду, в которой каждый элемент может находиться в K устойчивых состояниях. Возьмем m таких устройств. Тогда m таких устройств могут нам дать N=K^m устойчивых состояний, т.е. с их помощью можно различать числа из диапазона [0,K^m-1]. Давайте зафиксируем N и попытаемся найти m, т.е. сколько надо иметь устройств, чтобы различать N различных состояний (чисел).

Ln N = m*Ln K

I Ln N I

m = I ---- I таких устройств

I Ln K I

Hайдем число устойчивых состояний такой среды при фиксированном значении N как функцию от K:

I Ln N I

Q(K) = K*m = K I ---- I

I Ln K I

Рассмотрим задачу: Hайти такое K при котором число необходимых устойчивых состояний среды было бы минимальным. Продифференцируем по K (не учитывая дискретность этой функции) и приравняем нулю:

Ln N * (Ln K - 1)

Q'(K) = ----------------- = 0

(Ln K)^2

Отсюда Ln K = 1 или K=e =2.8 = 3, т.е. наиболее экономным, а значит и наиболее надежным является устройство с тремя устойчивыми состояниями.

Q(K) ^

I ---

I ---

I --- ---

I ---

I--------------------------------> K

0 1 2 3 4

Hапример, необходимо изображать числа в диапазоне 0-999.

В десятичной системе имеем

Q(10) = 3*10 = 30.

В двоичной системе 1000 < 1024 = 2^10, т.е.

Q(2) = 2*10 = 20.

Как видим двоичная система экономней десятичной.

Из-за своей простоты принято кодировать числа именно в двоичной системе.

Создано множество систем кодирования с помощью двоичных разрядов:

Телеграфный ко М2 использует 6 двоичных разрядов под знак

КОИ7 7

ДКОИ 8

ASCII 8

1.1.3. АБСТРАКТHЫЕ СТРУКТУРЫ

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

Специфичность элементов множеств требует расширения набора операций над

множествами. Hаряду с традиционными операциями для множеств, такими как

пересечение, объединение, разность, принадлежность, рассматриваются и

операции

поиск

добавление

исключение и т.д.

Элементы множеств могут быть связаны между собой отношениями.

Пусть заданы множества

А1, А2, ..., Аn.

Определим C=А1хА2х...хАn как множество всевозможных комбинаций элементов а1,а2,...,аn, где аi С Аi. С называется декартовым произведением.

Отношением B называется некоторое подмножество C, выделяемое некоторым

оператором, условием или функцией

B=F(А1,А2,...,Аn)

Если

1.2. ОБЗОР ОСНОВНЫХ СТРУКТУР ДАННЫХ

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

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

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

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

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

В наиболее абстрактном виде любую структуру данных можно представить в виде:

Структура данных ---------

Представление (REP)

Дескриптор -----

Тело

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

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

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

Тело структуры данных - это набор взаимосвязанных элементов структуры, ради хранения и обработки которых структура, собственно, и была создана.

Тело (Body)

Классификация структур данных

======================================№4 ================

Структуры данных и их классификация (последовательные структуры, массивы).

Классификация структуры данных:

1)последовательная структура данных, при этом адресация и доступ последовательны

а) длины элементов одинаковы;

б) длины элементов различны: используется метод разделителей

2)вычисляемый доступ;

3)вычисляемый доступ с вынесенным дескриптором: все длины собирают отдельно от самих элементов;

4)базированный метод доступа: хранятся не просто длины, а наполненные длины;

5)координатный прямой доступ: в качестве элементов в дескрипторе хранятся абсолютные адреса.

Лин стр дан – это С.Д. совокуп элементов которой является лин упорядоч. Лин С.Д. являются : 1)Последовательность 2)Эластичная лента 3)Лин списки а)стек б)дек в)очередь г)приор очередь 4)Строки. Приведем операции, которые можно выполнять над лин С.Д. 1)Создать 2)Получить доступ к узлу 3)Включить новый узел 4)Исключить узел 5)Объединить две структуры в одну 6)Разбить структуру на две 7)Сделать копию 8)Определить кол-во узлов в списке 9)Выполнить сортировку узлов 10)Найти узел, удовл задан услов 11)Уничтожить. Особую роль играют операции 2),3),4). Именно с помощью их можно последовательно конструировать, изменять и обрабатывать списки. Важными представляются случаи когда операции выполн с первым и последним элем структуры. Классифицирм типы лин стр по главным операц, которые сними выполн. Особую группу представл списки, в которых включение, исключение и доступ почти всегда производится в первом или последнем узлах. Рассм эти часто используемые С.Д. 1)Стек – лин сп, в котор все включен и исключен делаются в одном конце списка 2)Очередь– лин спис, в котор все включен на одном конце, а исключен на другом. 3)Дек – очередь с двумя концами, включ. и исключ. на обеих концах 4)Архив – дек с огранич входом 5)Реестр – дек с огранич выходом. В математике все эти структуры назыв очередями с различн дисциплинами обслуживания. Наиболее часто исп стек и очередь. Стек организован по принципу LIFO (Last-In-First-Out), очередь по принципу FIFO (First-In-First-Out). Рассм другие лин структ дан.

Последовательность. Элем послед в кажд момент врем разделены на две части – прочитанную и непрочитанную. Можно провести аналогию между последовательностью и файлом.

Строки. Строки состоят из символов, которые нужно кодировать. Возможны коды: 1)Фиксир длин ДКОИ – 6 бит ; КОИ – 7 бит; ASCII – 8, бит. сейчас реализуется 16 бит код, он кодир 65536 симв. 2)Коды перем длин. Рассм спец операц для строк: 1)Конкатенация 2)Дописывание одного символа в конец строки 3)Поиск вхожден подстроки в строку 4)Сопоставлен с образцом 5)Удаление подстроки 6)Вставка подстроки в строку 7)Контекстная замена. Представлен строк. строки могут быть представлены разными способами. 1)Строки фиксир длинны с указанием длинны(TP) 2)послед симв до первого встретившегося нуля(Си) 3)Хранение в виде списка посимвольно 4)Хранение в виде списка многосимвольных звеньев фиксир длинны 5) - || - переменной длинны.

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

а) Если длины элементов одинаковы, то такая структура может рассматриваться как массив:

Адрес Аn = длина * (n-1) + Адрес А1

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

Таким образом, встает вопрос об отделении одного элемента от другого.

б) Метод разделителей. Выбираем какой-то элемент, не принадлежащий данным, хранящимся в структуре, в качестве разделителя. Например, символ (*).

А1 * А2 * А3 * ... Аn \

Признак конца

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

в) Обработку можно ускорить, если в качестве разделителя взять длину элемента с фиксированным расположением в поле элемента (например, в начале элемента структуры).

L1 А1 L2 А2 ... Ln Аn \

В этом случае

Адрес Аn = СУММА Li + Адрес А1

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

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

L1 L2 ... Ln

А1 А2 ... Аn

Наряду с длинами можно хранить и другие характеристики элементов, например, их теги ("ярлычки"), описывающие тип хранимой в элементе информации. Все общие характеристики элементов структуры можно не дублировать в каждом элементе, а иметь идин на всю структуру и хранить в дескрипторе структуры. Этим можно добиться существенной экономии памяти.

д) Давайте будем хранить не длины элементов, а накопленные длины:

0 L1 L1+L2 ... СУММА Li

S1 S2 S3 ... Sn

А1 А2 ... Аn

где Sk - это смещение k-ого элемента структуры относительно начала.

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

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

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

Вынесение дескрипторов элементов в один лескриптор структуры имеет еще один недостаток, а именно, при потере дескриптора воможна потеря всей информации, хранящейся в структуре.

Метод с единым дескриптором принято называть координатным методом доступа.

ВЫВОД: Последовательная структура является существенно статической структурой со сложной реорганизацией.

II. Массив - это структура данных с последовательным расположением элементов и произвольной обработкой. Доступ к элементам массива вычисляемый (по индексам). Т.к. надо уметь вычислять адрес элемента по индексам, то предполагается, что все элементы массива имеют одинаковую длину.

а) одномерный массив (вектор)

Адрес Аi = Адрес А1 + (i-1)*L,

где L - длина элемента.

б) двумерный массив (матрица)

Hеобходимо выбрать расположение двумерного массива в линейной памяти (по строкам, по столбцам или каким-нибудь другим способом).

Hапример, элементы массива располагаются в памяти по строкам. В этом случае

для матрицы А = (nxm) имеем

Адрес Аi,j = Адрес А1 + (i-1)*m*L + (j-1)*L = [(i-1)*m+(j-1)]*L

Величину k = (i-1)*m+(j-1) + 1 называют приведенным индексом, т.е.

Адрес Аi,j = Адрес А1 + (k-1)*L

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

в) трехмерный массив можно представить состоящим из слоев двумерного

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

Итак, массив - это набор однотипных элементов, расположенных в памяти подряд и доступ к которым осуществляется по индексам, не хранящимся вместе с элементами данных.

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

Массивы, как правило, имеют встроенную реализацию в языках программирования. Hо эти реализации в разных системах программирования могут существенно отличаться. Рассмотрим такие типичные реализации.

а) Языки FORTRAN и PASCAL предоставляют пользователю многомерные статические массивы. Память под такие массивы выделяется раз в начале работы программы и размер массива не может меняться в процессе выполнения программы.

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

в) Язык CLU предоставляет пользователю одномерные массивы с подвижными границами. Верхняя и нижняя границы массива могут меняться динамически в процессе выполнения программы с помощью специальных операций:

операции addl и addh - увеличивают массив в сторону младших/старших индексов;

операции reml и remh - соответственно укорачивают массив.

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

III. Если в структуре часто приходится удалять\добавлять элементы, то целесообразно использовать списковые структуры. Это структура с последовательной обработкой и произвольным размещением.

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

L -----------

А1 ---- А2 ---- ... ---- Аn /

В последнем элементе находится ссылка в никуда (nil) - признак конца списка.

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

Примеры представления списков

L --- Beg Fin

2 ---- 10 ---- ... ---- 1 /

1. Иванов

2. Петров

...

10. Сидоров

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

последний элементы, и элементами, хранящимися в линейном массиве.

В зависимости от количества и ориентации указателей различают:

линейные однонаправленные списки;

линейные двунаправленные списки;

кольцевые однонаправленные списки;

кольцевые двунаправленные списки;

многоуровневые списки (язык LISP);

произвольные (многосвязные) списки (сети).

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

IY. Табличные структуры.

Здесь порядок обработки и расположения элементов не регламентированы

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

осуществляется по его значению (ключу), который, как правило, должен

быть частью элемента таблицы. Место расположения элемента определяется

или с помощью специальной функции

Адрес = f(k), преобразующей значение ключа в адрес (такая функция называется функцией хеширования или расстановки) или с помощью специальной операции поиска.

Таблицы могут быть реализованы на базе массивов, списков, деревьев и т.д. В зависимости от этого они могут быть динамическими или статическими, линей-ными или древовидными и т.д.

===============================================================================

Соседние файлы в папке POSIBNIK