Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать
      1. Очереди

Другая фундаментальная структура данных с ограниченным доступом называется очередь. Снова, очередь поддерживает только две базовые операции: одна из них вставляет элемент в очередь и называется insert, а другая удаляет элемент из очереди и называетсяremove. В отличие от стека, основной идеологией очереди является то, что элементы обрабатываются в порядке их поступления. Такая идеология называется FIFO (первый пришел – первый вышел). В стеке используется идеология LIFO (последний пришел – первый вышел).

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

constmax=100;varqueue :array[0..max] of integer; head, tail : integer;

procedurePut(v : integer);beginqueue[tail]:=v; tail:=tail+1;if tail>maxthen tail:=0;end;

function Get : integer;beginGet := queue[head]; head := head+1;if head>maxthenhead := 0;end;

procedure QueueInitialize;beginhead := 0; tail := 0end;

functionQueueEmpty : boolean;begin QueueEmpty := (head=tail)end;

Нам необходимо иметь два индекса, один на начало очереди (head), другой – на ее конец (tail). Содержимое очереди – это все элементы междуheadиtail, принимая во внимание переход на 0, когда мы достигаем конца массива. Еслиhead=tail, то очередь пуста; если жеhead=tail+1, илиhead=0иtail=max, то список полный.

    1. Деревья

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

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

      1. Терминология

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

Деревом мы будем называть непустое множество узловисвязеймежду ними, которые удовлетворяют определенным требованиям. Узел, это простой объект, который может иметь имя, и содержать также некоторую другую информацию.Связь– это соединение между двумя узлами.Путьв дереве – это список различающихся узлов, в котором любые два следующих друг за другом узла соединены связью в дереве. Один из узлов в дереве мы будем называтькорнем дерева. Основополагающим свойством дерева является то, что между корнем дерева и любым его узлом существует, и притом единственный путь, состоящий из узлов дерева. Если же данное условие не выполняется, то мы имеем дело с графом, а не с деревом. На Error: Reference source not found показан пример дерева.

Хотя в определении и не говорится о направлении связей, мы обычно будем считать, что они направлены вниз от корня, или наоборот, в зависимости от задачи. Деревья мы будем рисовать сверху вниз с корнем наверху. Мы будем говорить, что узел y находится ниже узлаx(а узелxвыше узлаy) если узелxпринадлежит пути между корнем дерева и узломy.У каждого узла, за исключением корня, есть единственный связанный с ним узел лежащий сверху от него, называемыйродитель. Узел находящийся снизу от заданного узла и связанный с ним мы будем называтьребенкомилидочерним узлом.Иногда, аналогия с генеалогическим деревом будет еще «глубже», и мы будем называть узлы «прародителями» или даже «внуками» какого-нибудь узла; например узел E на Error: Reference source not found, является прародителем узла M.

  1. Пример дерева

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

Любой узел дерева является корнем поддерева, состоящего из него самого и всех узлов расположенных ниже его. Например, на Error: Reference source not found, изображено 8 одноузловых поддеревьев, 3 трехузловых и одно двухузловое. Множество деревьев называется лесом: например, если в данном примере мы удалим корень дерева, то в результате мы получим лес, состоящий из деревьев с корнями в узлах Р, Д и Р.

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

Каждый узел в дереве принадлежит к какому-либо уровню.Уровень узла это количество элементов на пути от корня к узлу (не считая самого элемента). Таким образом, в примере, приведенном на Error: Reference source not found узел Д расположен на первом уровне, корень Е – на нулевом.Высотой дерева мы назовем максимальный уровень среди всех элементов этого дерева.Длиной путидерева мы назовем сумму длин путей от каждого узла до корня (сумму уровней всех узлов). Дерево, приведенное на Error: Reference source not found имеет высоту 2 и длину пути 19. Если внутренние узлы отличимы от внешних, то мы говорим овнутренней длине пути дерева ивнешней длине пути дерева.

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

Специальным случаем деревьев с фиксированной структурой являются бинарные деревья. Бинарное дерево это упорядоченное дерево, состоящее из двух типов узлов: внешние узлы (не имеющие детей) и внутренние узлы, имеющие ровно по два ребенка. На Error: Reference source not found показан пример бинарного дерева. Так, как дети каждого внутреннего узла бинарного дерева упорядочены, то для удобства мы будем именовать их правый ребенок и левый ребенок внутреннего узла: каждый внутренний узел должен иметь и левого и правого ребенка, хотя каждый из них может быть внешним узлом.

  1. Пример бинарного дерева

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

Полным бинарным деревом мы назовем дерево, в котором внутренние элементы полностью заполняют каждый его уровень, за исключением возможно последнего.Совершенное бинарное дерево это полное бинарное дерево, на последнем уровне которого, внутренние и внешние узлы не перемешаны. На Error: Reference source not found приведен пример совершенного бинарного дерева. Бинарные деревья довольно интенсивно используются во многих компьютерных задачах, и их возможности максимальны, когда дерево полное или почти полное.

  1. Пример совершенного бинарного дерева

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