- •Поиск и включение для деревьев
- •Исключение из деревьев
- •Сбалансированные деревья
- •Включение элементов в сбалансированное дерева.
- •1 Случай
- •2 Случай
- •Исключение из балансированного дерева (авл)
- •Критерии и оценки алгоритма. Общие методы.
- •Асимптотические характеристики
- •Роль и методы в снижении трудоемкости решения задачи
- •Структура данных для описания решетки.
- •Частные характеристики качества алгоритмов
- •Увеличение быстродействия программ
- •Хеширование
- •Хеш таблицы.
- •Хеш функции
- •Двойное хеширование
- •Идеальное хеширование
- •Алгоритмы для работы с графами
- •Деревья поиска в ширину
- •Поиск в глубину
- •Стягивающие или остовные деревья
- •Минимальное остовное дерево
- •Эйлоровый цикл
- •Гомельтоновый цикл
- •Кротчайшие пути в ориентированных графах.
- •Комбинаторика
Деревья поиска в ширину
Формально говорят для графа j с исходной вершиной S мы определяем подграф предшественния. Графа j. G=(V,E) Gp(V,Ep) Vp={uэ V:p[u]<>nil} U {s}
Ep={(p[u],u):uэVp{s}
Для него vp состоит из вершин достижимых из S и для всех вершин v в графе ? имеется единый простой путь из S[v] одновременно является кратчайшим путем из S[v] для графа j. Предполагая что построено с fSearch.
Procedure pring.path (G,S,u);
U=S
+ *
Print s
Вывод “Путь из S в u отсутствует’’
- +
P[u]=nil
-
Print_path(G,S,p[u])
*
Выв U
End
Поиск в глубину
Начинается Поиск фиксированной вершины v, рассматривается вершина u смежная с v, она выбирается. Процесс повторяется далее с вершиной u. Если на очередном шаге работы с вершиной q и нет вершин смежных с q и нет рассмотренных ранее, то делаем шаг назад т.е. возвращаемся из вершины q к вершине которая была до нее. В том случае, когда при возврате попали на вершину v процесс просмотра закончен.
Для фиксации признака просмотренный вершины графа или нет введем такую структуру
Nnew: array [1..N] of Boolean;
Рассмотренная вершина графа или нет. Если Nnew[i] равно истина, то вершина I не просмотрена. Пусть граф представляет матрицу смежности.
A[I,j]= 1,I смежное с j
0, иначе
Номера просмотренных вершин будем запоминать в стеке st, указатель как yk.
Procedure PGn(v:integer); var st:array [1..N] of integer yk,t,j:integer; ppLboolean;
FillChar (st,sizeof(st),0) yk=0
Inc(yk) st[yk]=u Nnew[v]=False
While Yk<>0
* -
End
+
t=st[yk]
Выв выбранной вершины
Repeat <-
A[t,j] <>0) and (Nnew[j]=true)
Pp=true
+
Pp=true or (j>=N)
-
-
j=j+1
- +
pp=true
inc(yk) st[yk]=j Nnew[j]=false
уk=yk-1
*
найдена смежная вершина или все смежные уже были просмотрены
В рекурсивной
Procedure pg(v:integer); var j:integer;
Nnew[v]=False
Выв V
End
*
J=1 to N
(Avj<>0) and (new[j]=true)
pg(j)
* +
…. Fillchar(nnew,siseof(nnew),true); for I:=1 to n do If nnew[i] then pg[i];
Стягивающие или остовные деревья
Дерево – произвольный, связанный не ориентированный граф без списка. Связанный n вершин и n-1 ребро.
G=(V,E) (V,T) T э E Называется стягивающим деревом, каркас или остов.
Ребра — это дерева называются ветвями, а остальные ребра хордами. Число различный каркасов полного связанного неориентированного помеченного графа с n вершинами NN-2.
Граф из трех вершин
Методы просмотра вершин графа поиска в глубину и ширину позволяет построить каркас. Каждый метод строит 1 каркас.
Порождения всех каркасов графа
Дано: связанный неориентированный граф G=(V,E). Найти все каркасы. Каркасы не запоминаются, а только выводятся. Каждый очередной порождается на базе последнего.
List turn:array [1..N] of integer; Down, //нижний указатель, вершина берем из turn up // верхний указатель Nnew: array pf [1..N] of Boolean // массив признаков tree: array [1..2,1,..(N-1)] of integer; //список ребер образующих каркас numbo //число ребер строящихся в каркасе
Fillchar(nnew,sizeof(Nnew),true); Fillchar(Tree,sizeof(Tree),0); Nnew[1]=False; Turn[1]:=1; Down:=1; Up:=2; Numb:=0;
Граф представлен матрицей смежности. В массиве 3 далее организуем процедуру построения каркаса
1 каркас будем строить обычным поиском в ширину. Затем исключаем последнее ребро и строим новый каркас . Затем исключаем предпоследнюю и строим свой каркас.
Procedure karkas (v,g:integer);
V – вершины из который выходит ребро g – номер вершины из которой нужно искать ребро
Var j:integer;
+
Down>=Up
Exit
J=g
While (j<=N) and (numd<=(N-1))
- +
-
(a[v,j] <> 0) and (Nnew[j])
Inc(j)
While
+
J=g
Nnew[j]=false
Inc(numb)
Tree[1,numb]=V Tree[2,numb]=j
Turn[up]=j inc(up)
Karkas (v,(j+1))
Dec(up) Nnew[j]=True Dec(np),Knew[j]:=True; dec(Numb)
+
Numb=(N-1)
выв каркаса tree
-
Exit
Все ребра из вершины v просмотрены, проходим к следующей вершины из очереди, до тех пор, пока не будет построен каркас
j=N+1
End
Inc(Down)
Karkas(Tuen[down],1)
Dec(down)