- •1.Основные понятия эис
- •19. Классификация алгоритмов
- •Классификация Алгоритмов
- •20. Абстрактные типы данных (массивы, связанные списки, выделение памяти)
- •Абстрактные типы данных
- •Элементарные Структуры Данных
- •Массивы
- •Связанные списки
- •Выделение Памяти
- •21. Стеки, очереди, деревья
- •Очереди
- •Деревья
- •Терминология
- •22. Математические характеристики деревьев
- •Свойства
- •23. Обход деревьев
- •Обход Деревьев
- •Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •25. Критерии эффективности алгоритмов (формирование, поиск последовательного масиива)
- •26. Критерии эффективности алгоритма ступенчетого поиска
- •27. Сортировка методом Шелла Сортировка Шелла
- •28. Сортировка простым включением
- •29. Приоритетные очереди
- •30. Радикс сортировка Радикс Сортировка
- •Сортировка Радикс Обменом
- •Прямая Радикс Сортировка
- •Свойства Радикс Сортировок
- •31. Рекурсия Рекурсивные определения
- •Рекурсивные процедуры
- •Итерация и рекурсия
- •32. Рекурсивный обход деревьев, удаление рекурсии Рекурсивный Обход Дерева
- •Удаление Рекурсии
- •33. Элементарные методы сортировки и их характеристики Элементарные Методы Сортировки
- •Правила Игры
- •Сортировка Выбором
- •Сортировка Вставкой
- •34. Простейшие алгоритмы сортировки (методом пузырька, сортировка выбором, шейкер сортировка, ростировка Шелла), сравнение простых методов сортировки. Пузырьковая Сортировка
- •Характеристики Простейших Сортировок
- •Сортировка Файлов с Большими Записями
- •Сортировка Шелла
- •Подсчет Распределения
- •35. Алгоритмы быстрой сортировки, разрядная сортировка Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •36. Пирамидальная сортировка Пирамидальная сортировка
- •37. Сортировка слиянием (простое слияние, двухпутевое слияние, рекурсивный алгоритм слияния) Сортировка слиянием
- •Простое слияние
- •Y 1 2 3 4 5 6 7 8
- •Естественное двухпутевое слияние
- •Рекурсивный алгоритм слияния
Очереди
Другая фундаментальная структура данных с ограниченным доступом называется очередь. Снова, очередь поддерживает только две базовые операции: одна из них вставляет элемент в очередь и называется 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, то список полный.
Деревья
Структуры, которые мы обсуждали раньше, были одномерные: в них один элемент следует за другим. Теперь рассмотрим двухмерные связанные структуры, которые называются деревьями. На них основаны многие из наиболее важных алгоритмов. Полное описание деревьев могло бы занять не одну книгу, потому что они возникают во многих задачах, даже вне информатики, и довольно интенсивно изучаются как математический объект. В этой главе мы дадим основные определения и терминологию, связанную с деревьями, изучим некоторые их свойства, и обсудим способы из компьютерной реализации. Позднее, мы встретим множество алгоритмов использующих эту структуру данных.
В повседневной жизни мы очень часто встречаемся с использованием деревьев. Одним из распространенных примеров является генеалогическое дерево; как мы увидим, много терминов, связанных с деревьями, взято именно отсюда. Второй пример, это структура большой организации; использование древообразной структуры для представления ее «иерархической структуры» ныне широко используется во многих компьютерных задачах. Третий пример – грамматическое дерево. Изначально оно служило для грамматического анализа компьютерных программ, а ныне широко используется и для грамматического анализа литературного языка.
Терминология
Мы начнем изучение деревьев с того, что определим их как некий абстрактный объект и введем всю связанную с ними терминологию. Существует множество эквивалентных способов их определения, также как и множество математических свойств деревьев, использующих эту эквивалентность.
Деревом мы будем называть непустое множество узловисвязеймежду ними, которые удовлетворяют определенным требованиям. Узел, это простой объект, который может иметь имя, и содержать также некоторую другую информацию.Связь– это соединение между двумя узлами.Путьв дереве – это список различающихся узлов, в котором любые два следующих друг за другом узла соединены связью в дереве. Один из узлов в дереве мы будем называтькорнем дерева. Основополагающим свойством дерева является то, что между корнем дерева и любым его узлом существует, и притом единственный путь, состоящий из узлов дерева. Если же данное условие не выполняется, то мы имеем дело с графом, а не с деревом. На Error: Reference source not found показан пример дерева.
Хотя в определении и не говорится о направлении связей, мы обычно будем считать, что они направлены вниз от корня, или наоборот, в зависимости от задачи. Деревья мы будем рисовать сверху вниз с корнем наверху. Мы будем говорить, что узел y находится ниже узлаx(а узелxвыше узлаy) если узелxпринадлежит пути между корнем дерева и узломy.У каждого узла, за исключением корня, есть единственный связанный с ним узел лежащий сверху от него, называемыйродитель. Узел находящийся снизу от заданного узла и связанный с ним мы будем называтьребенкомилидочерним узлом.Иногда, аналогия с генеалогическим деревом будет еще «глубже», и мы будем называть узлы «прародителями» или даже «внуками» какого-нибудь узла; например узел E на Error: Reference source not found, является прародителем узла M.
Пример дерева
Узлы, у которых нет детей, иногда называются листьями илитерминальные узлами.Узлы, у которых есть хоть один ребенок, называются нетерминальными. Терминальные узлы часто отличаются от нетерминальных тем, что они не содержат никакой «сопроводительной» информации. В связи с этим, терминальные узлы часто называютсявнешними узлами, а нетерминальные –внутренними.
Любой узел дерева является корнем поддерева, состоящего из него самого и всех узлов расположенных ниже его. Например, на Error: Reference source not found, изображено 8 одноузловых поддеревьев, 3 трехузловых и одно двухузловое. Множество деревьев называется лесом: например, если в данном примере мы удалим корень дерева, то в результате мы получим лес, состоящий из деревьев с корнями в узлах Р, Д и Р.
Иногда порядок, в котором дети каждого узла расположены, важен, а иногда нет. Упорядоченнымдеревом мы назовем такое дерево, в котором порядок следования детей в узле важен.
Каждый узел в дереве принадлежит к какому-либо уровню.Уровень узла это количество элементов на пути от корня к узлу (не считая самого элемента). Таким образом, в примере, приведенном на Error: Reference source not found узел Д расположен на первом уровне, корень Е – на нулевом.Высотой дерева мы назовем максимальный уровень среди всех элементов этого дерева.Длиной путидерева мы назовем сумму длин путей от каждого узла до корня (сумму уровней всех узлов). Дерево, приведенное на Error: Reference source not found имеет высоту 2 и длину пути 19. Если внутренние узлы отличимы от внешних, то мы говорим овнутренней длине пути дерева ивнешней длине пути дерева.
Если у каждого узла дерева должно быть конкретное количество детей, то мы имеем дело с деревом фиксированной структуры. Для таких деревьев имеет смысл определять внешние узлы специальной структуры не имеющих детей и не содержащих какой-либо информации.
Специальным случаем деревьев с фиксированной структурой являются бинарные деревья. Бинарное дерево это упорядоченное дерево, состоящее из двух типов узлов: внешние узлы (не имеющие детей) и внутренние узлы, имеющие ровно по два ребенка. На Error: Reference source not found показан пример бинарного дерева. Так, как дети каждого внутреннего узла бинарного дерева упорядочены, то для удобства мы будем именовать их правый ребенок и левый ребенок внутреннего узла: каждый внутренний узел должен иметь и левого и правого ребенка, хотя каждый из них может быть внешним узлом.
Пример бинарного дерева
Смысл бинарного дерева заключается в структурировании внутренних узлов; внешние узлы служат лишь как ограничители. Мы включаем их в определение потому, что наиболее общие виды представления бинарных деревьев должны учитывать внешние узлы. Бинарное дерево может быть «пустым» и состоять только из одного внешнего узла.
Полным бинарным деревом мы назовем дерево, в котором внутренние элементы полностью заполняют каждый его уровень, за исключением возможно последнего.Совершенное бинарное дерево это полное бинарное дерево, на последнем уровне которого, внутренние и внешние узлы не перемешаны. На Error: Reference source not found приведен пример совершенного бинарного дерева. Бинарные деревья довольно интенсивно используются во многих компьютерных задачах, и их возможности максимальны, когда дерево полное или почти полное.
Пример совершенного бинарного дерева