Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oaip.docx
Скачиваний:
7
Добавлен:
26.09.2019
Размер:
292.13 Кб
Скачать
  1. Связные компоненты графа. Деревья. Бинарное дерево как связный граф без циклов

Упорядоченное дерево — это дерево, у которого ветви, исходящие из каждой вершины, упорядочены по определенному критерию. Поэтому два упорядоченных дерева на рис. 9.3 — это разные, отличные друг от друга, структуры.

Рис. 9.3. Два различных бинарных дерева

Упорядоченные деревья второй степени (m-арные при m=2) называют двоичными или бинарными деревьями. Упорядоченное бинарное дерево можно определить как множество элементов (вершин), которое либо пусто, либо состоит из корня с двумя отдельными двоичными деревьями, которые называют левым и правым поддеревьями этого корня. Деревья степени больше двух называют сильно ветвящимися деревьями (multiway trees).

При представлении бинарного дерева в виде связного списка каждый элемент может содержать поля данных и два структурных указателя: указатель левого (left) сына и указатель правого (right) сына. Таким образом, элементы бинарного дерева могут иметь такой тип:

Type Pt = ^Node;

Node = Record

Key : Char;

Left, Right : Pt;

End;

Где Kеу — это поле идентифицирующего элемент ключа; Left и Right — поля для структурных указателей.

Граф без циклов называется лесом. Вершины степени 1 в дереве называются листьями.

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

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

2.Сортировка вставками

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

Данный алгоритм также обладает слишком низким быстродействием.

procedure Vstavka;

var

z, y, i, j : integer;

begin

for i := 2 to n do

for j := 1 to i-1 do

if X[j] > X[i] then

begin

z := x[i];

for y := i downto j+1 do x[y] := x[y-1];

x[j] := z

end

end;

Билет №18

Поиск в глубину графа

Поиск в глубину (англ. Depth-first search, DFS) — один из методов обхода графа. Алгоритм поиска описывается следующим образом: для каждой непройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них. Используется в качестве подпрограммы в алгоритмах поиска одно- и двусвязных компонент, топологической сортировки.

Алгоритм поиска в глубину.Пусть задан граф G=(V,E), где V— множество вершин графа, E— множество ребер графа. Предположим, что в начальный момент времени все вершины графа окрашены в белый цвет. Выполним следующие действия:

Из множества всех белых вершин выберем любую вершину, обозначим её u1.

Выполняем для неё процедуру DFS(u1).

Повторяем шаги 1-3 до тех пор, пока множество белых вершин не пусто.

Процедура DFS (параметр — вершина uԑV )

Перекрашиваем вершину u в черный цвет.

Для всякой вершины w, смежной с вершиной u и окрашенной в белый цвет, выполняем процедуру DFS(w).

Пример реализации:

const

MAX_N = 10;

var

graph: array [1..MAX_N, 1..MAX_N] of boolean; // массив для определения графа

visited: array [1..MAX_N] of boolean;

procedure dfs(v: integer);

var

i: integer;

begin

visited[v] := true;

for i := 1 to MAX_N do

if graph[v, i] and not visited[i] then

dfs(i);

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