Файл: Динамические структуры данных. Бинарные деревья..pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.03.2023

Просмотров: 85

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

В языках программирования (Pascal, C, др.) существует способ выделения памяти под данные, который называется динамическим. В этом случае память под величины отводится во время выполнения программы. Такие величины будем называть динамическими. Раздел оперативной памяти, распределяемый статически, называется статической памятью; динамически распределяемый раздел памяти называется динамической памятью (динамически распределяемой памятью).

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

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

Предметом данного исследования являются динамические структуры данных в программировании.

Объектом исследования являются деревья в динамических структурах данных.

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

Для достижения поставленной цели необходимо решить следующие задачи:

  1. рассмотреть понятие, сущность и необходимость динамических структур данных;
  2. изучить классификацию динамических структур данных;
  3. выявить динамические структуры данных, а именно деревья;

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

При написании данной работы использовался метод анализа научной литературы отечественных и зарубежных авторов, таких как Кернигана Б., Ритчи Д., Подбельского В. В., Фомина С. С., Будниковой Н.А., Хабибуллина И.Ш., Абилова К.С., Бабаева М.А., Галагузовой М.А. и др.

Глава 1. Теоретические аспекты динамических структур данных: деревья


Понятие, сущность и необходимость динамических структур данных

данных в в памяти не только их элементов, но и между .

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

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

Динамические структуры – это данных, под выделяется и по необходимости.

данных тем что:

  1. она не имени; ей в процессе ;
  2. количество может не ;
  3. структуры в процессе ;
  4. в процессе может взаимосвязи структуры[1].

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

– это статические , они требуют . в динамических обычно в случаях.

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

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

Для между структуры , через явные элементами. данных в связным. представления – в обеспечения структур:

1. ограничивается объемом ;

2. при изменении элементов не перемещение в , а только ;

3. большая [2].

Вместе с тем, не лишено и , из которых :

  1. на поля, для связывания с другом, память;
  2. к связной быть по времени[3].

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

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

Порядок с динамическими следующий: ( место в ); работать при ; удалить ( структурой ).

1.2 динамических

Для того, в выполнения добавлять и , необходимо не в массив, а в . Если к добавить ещё и , в будет какого-то , то это и будет проблемы. представления и называется данных. динамических состоит из и одного или , ссылающихся на . Это позволяет в структуру или удалять из , не затрагивая при элементы [4].


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

Динамические бывают и . В линейной данные в . К линейным списки (, , кольцевые), , (односторонние, , с приоритетами). структур . Нелинейные , как правило, в (каждый некоторое , например, в каждый ( ) имеет на и правый ).

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

К таким :

  1. однонаправленные () ;
  2. двунаправленные () ;
  3. циклические ;
  4. ;
  5. дек;
  6. очередь;
  7. [5].

Они отличаются отдельных допустимыми .

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

1.3 данных:

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

1. узел, в не ни одной ( );

2. в каждую , корня, дуга[6].

— это граф без . того, в одна , называется . Остальные по длине от дерева (см. рис. 1).

Рисунок 1 Динамическая структура данных: дерево

нами 1, зафиксируем X. Вершины, с X и расположенные нее от дерева, или сыновьями X. упорядочены . Вершины, у нет , называются . обычно , корнем .

в программировании чаще, чем . Так, на деревьев алгоритмы и .

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

Рисунок 2 Динамическая структура данных-дерево (оглавление книги)

Представим, что из частей, — из , главы — из . книга дерева, из ребра к , частям .

В очередь, из книги к вершинам-главам, в эту , и так далее. компьютера представить в . Вершинам (их также или папками) и [7].

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

Вершина в виде , ссылки на и на всех , а некоторую , зависящую от .

Объект, дерева, фиксированного , обычно в памяти. обычно , из смысла .

Так, очень бинарные , в число у вершины не . Если или сыновей у , то соответствующие нулевые . образом, у все ссылки на .

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


же у есть , то он вызывается для из сыновей. поддеревьев от алгоритма[8].

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

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

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

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

type

T = Integer; { скрываем зависимость от конкретного типа данных }

TTree = ^TNode;

TNode = record

value: T;

Left, Right: TTree;

end;

Здесь поля Left и Right - это указатели на потомков данного узла, а поле value предназначено для хранения информации.

1.4 над деревьями

Для определены :

1. корня

2. узла в

3. по дереву

4.

5. удаление .

Для с деревьями алгоритмов. К относятся и обхода . в программе переменных: var t: ptr; s: ; c: ; b: boolean;

дерево с помощью процедуры:

procedure V (var t: ptr) var st: string begin readln (st) if st<>'. 'then begin new (t) t. info: =st V (t. Llink) V (t. Rlink) end else t: =nil end

отражается во данных: пустой условный (в случае ). Для на рис.3 имеет вид:

type

PNode = ^TNode;

TNode = record

Info : string; {поле данных}

Left,Right : PNode; {указатели на левое и правое поддеревья}

end;

Процедура создания нового узла.

{ Создание нового узла со значением информационного поля X.

Возвращается указатель на новый узел}

function NewNode(X:string):PNode;

var

P : PNode;

begin

New(P);

P^.Info := X;

P^.Left := Nil;

P^.Roght := Nil;

NewNode := P;

end;

три способа : в прямом , и концевом. может рекурсивной и без рекурсии ( )[9]. В приведенной процедуре дерева в .

Нерекурсивный дерева в :

program FactDemo;

var

k : integer;

function Factor(n:integer):integer;

begin

if n=0 then

Factor : 1

else

Factor := n * Factor(n-1);

{end if}

end;

begin

write(’Введите целое число ’);

readln(k);

if k>=0 then

writeln(’Факториал ’,n:1,’ = ’, Factor(k));

{end if}

end.

Пусть T - на дерево; А - , в заносятся еще не вершин; TOP - ; P - рабочая .

1. установка: TOP: =0; P: =T.

2. , то перейти на 4. { }

3. Вывести P. . заносим в : TOP: =+1; A [TOP]: =P; шаг по : P: =P. llink; на 2.

4. TOP=0, то .

5. вершину из : P: =A []; TOP: =TOP-1;

Шаг по : P: =P. rlink; на 2.

, деревом , или в виде , двоичное в слева от находятся с , меньшими из вершины, а - с элементами (, что все дерева и что их тип (ТЭД) операций )[10].


2. Реализация по с бинарными

2.1 программы

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

Для бинарного в введем тип, вид записи:

Type

PNode = ^TNode;

TNode = record

Data : integer; {информационное поле}

left,right : PNode;

end;

Процедура создания нового узла.

{ Создание нового узла со значением информационного поля X.

Возвращается указатель на новый узел}

function NewNode(X:string):PNode;

var

P : PNode;

begin

New(P);

P^.Info := X;

P^.Left := Nil;

P^.Roght := Nil;

NewNode := P;

end;

Процедура создания потомка (поддерева)

procedure SetLeft(P:PNode; X:string);

begin

P^.Left := NewNode(X);

end;

3. дерева:

- ( числа) с ;

- дубликаты не (но на экран);

- ввода числа 0;

- – упорядоченное .

При динамических «дерево» используются .

Рекурсия некоторого с самого .

При структур « » чаще рекурсивные .

предполагает понятия с этого . Вирт утверждение о «… мощность с тем, что она позволяет множество с конечного »[11].

рекурсивного факториал :

n! = 1 при n=0

n! = n*(n-1)! при n >0

В Турбо-Паскале рекурсия разрешена: подпрограмма может вызывать сама себя:

program FactDemo;

var

k : integer;

function Factor(n:integer):integer;

begin

if n=0 then

Factor : 1

else

Factor := n * Factor(n-1);

{end if}

end;

begin

write('Введите целое число ');

readln(k);

if k>=0 then

writeln('Факториал ',n:1,' = ', Factor(k));

{end if}

end.

Первое вычисляется, n=0, оно в соответствующий . Теперь на шаге членов -1) известны, и в это выражение , на предыдущем . Это в процессе .

Сформулируем два рекурсивных :

1. тривиального .

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

Для функции «» случай:

2. сложного в более .

При входных выход за конечное вызовов. Для новый алгоритма более .

Иными алгоритм определение случая в простого .

Для «факториал» n! заменяется -1)!, и при этом с значение n , к нулю и его за число [12].

Из структуры « » видно, что она по , а в силу являются и все работы с . Для достаточно на выше бинарного .

В процедуре Add случай ( пустое) и

: добавить в и поддеревья – Add () и ).

Алгоритмы с

В приведенных предполагается, что ( ) дерева записью:

Type

PNode = ^TNode;

TNode = record

Data : integer; {информационное поле}