- •Поиск и включение для деревьев
- •Исключение из деревьев
- •Сбалансированные деревья
- •Включение элементов в сбалансированное дерева.
- •1 Случай
- •2 Случай
- •Исключение из балансированного дерева (авл)
- •Критерии и оценки алгоритма. Общие методы.
- •Асимптотические характеристики
- •Роль и методы в снижении трудоемкости решения задачи
- •Структура данных для описания решетки.
- •Частные характеристики качества алгоритмов
- •Увеличение быстродействия программ
- •Хеширование
- •Хеш таблицы.
- •Хеш функции
- •Двойное хеширование
- •Идеальное хеширование
- •Алгоритмы для работы с графами
- •Деревья поиска в ширину
- •Поиск в глубину
- •Стягивающие или остовные деревья
- •Минимальное остовное дерево
- •Эйлоровый цикл
- •Гомельтоновый цикл
- •Кротчайшие пути в ориентированных графах.
- •Комбинаторика
Структура данных для описания решетки.
Удельные затраты меняем на алгоритмы. Для описания решения применяем динамических массив.
0 (1,6) (3,5) 1 (4,6) 2 (0,4) (3,9) (5,5) (8,4) 3 4 5 6 7 8 9 10 (7,5)
Каждая пара: номер узла, куда ушла дуга и вес дуги.
Type zap=record v,d:integer; end; stroka=array pf zap; din:array of stroke;
Procedure krits (vh:integer; var G:din; r,t:array of integer; var tp:integer); Процедура krits возвращает время всей работы tp и массивы R по которой определяется критический путь.
Var j,k,n,tt,u,w:integer
n=Length(G)
Set length(S,n) (stk,n)
J=0 to (n-1)
With p^ do
q<>nil
tj=0;Sj=0
R(vh)=-1
J=0 to (n-1)
K=0 to hight (Gj)
Inc (S[G[j,k],v])
K=0 stk [k]=vh
Repeat
U=stk[k] k=k-1
J=0 to high(G[0])
Tt=tu+(G[u,j].d w=G[u,j].v
tt>tw
+
tw=tt Rw=u
Sw=Sw+1
Sw>=0
+
K=k+1
Stk[k]=w
-
k<0
+
tp=t[u]
-
repeat
End
Fuction F(v,d:array of integer):stroka; var d,k:integer
K=length(v) setlength (Result,k)
j=0 to (k-1)
End
F[j].v=vj F[j].d=dj
Button1Click
Ввод n
Setlength (G,n) (R,n) (t,n)
G[0]=f([1,3],[6,5])
G[1]=F([4][6])
G[2]=F([0,3,5,8],[4,9,5,4])
Krits(2,G,R,t,Rt)
Выв Rt; {Rj}
j=1 to критическому пути
End
Пространственная и временная структурность алгоритмов
Для максимального использования быстродейственного процесса и ОП ставится быстрый кэш. Досткп к нему занимает 1-2 или несколько тактов.
Небольшой (быстрый) кэш. Большой (медленный) кэш до 512
Медленный кэш может делиться на 2 уровня
регистры |
Кэш 1-го уровня |
Кэш 2-го уровня |
Оп |
Диск |
Чтобы процессор работал с быстрым кэшом это цель программиста. Когда нужного данного нет, называется промах мимо кэша. Малое количество промахов показатель качества алгоритма. Программа, удовлетворяющая требования пространственной локальности данных, если адреса совместно последней обработке данных близки. Доступ к данным отвечает временная локальность, если велика вероятность того ,что однажды исполняемый данные будут вновь использоваться в ближайшее время. Грамотная программа имеет 90% шанс попадания в кэш.
Частные характеристики качества алгоритмов
Важными качествами является наглядность алгоритма, рекурсия даст более компактную программу. Кроме того, обращение играет важную роль. Характеристика качества приближения алгоритма является гарантируемое достижение результата и времени.
Жадные алгоритмы:
Применяется в решении оптимизации задач, стремясь к максимальному или минимальному итогу, он на каждом шаге берет максимум или минимум из имеющихся возможных.
Например, жадный алгоритм в банкомата сначала отсчитывает купюры максимального достоинства, тем самым минимизируется общее количество банкнот.
Задача о рюкзаке объема V. Из n предметов разного объема и стоимость. Надо выбрать под множеством наименьшую общую стоимость. Если n>20 перебор будет паталогическим. Жадный алгоритм решается мгновенно, взамен качества.
Пример жадного алгоритма:
Исполняющий некоторый перечень ассигнаций момента - записать жадный алгоритм формирования заданной задачи. Общее число купюр и монет min.
Function Sdacha вернет величину сдачи и массив Ratmen, в которых для каждого номинала возвратит их число
Nomin[j]-> Ratmen [j]
Const Nomin:array [0..10] of curuncy=(5000,1000,500,100,50,10)
Function Sdacha (Cena,Plata:Currency:var; Ratmen:array of integer):Currency;
Z=plana-cena Result=z
J=0 to high (Ratmen)
J=0 to high (Ratmen)
End
z>Nomin [i]
Ratmen[j]=0
+
z=z-nomin[j] Ratmen[j]=Ratmen[j]+1
Задача о ферзях.
У- указывает текущую горизонталь. Заметные горизонтали обозначаем R[y]=1. Если снимаем ферзя при возврате, то необходимо R[y]=0 (обнулить)
Проверка угрозы по диагонали: Пусть х,у – тестирующая позиция ферзя, а координатой j и stek [y] (будет стек) относятся к ранее установленным ферзям. Тогда у ферзей на общей диагонали разности номеров (х,у) совпадают.
Abs(y-stek[j])=(x-j)
Проверку диагонали по позиции х делаем в цикле по всем позициям от 1 до (х-1)
Function Uspech – осуществляет поиск безлопастной клетки для х. Вернет истину, если ферзя удалось разместить.
Function uspech:Boolean
Result:=false
While
(y<1) and not result
End
-
+
y:=y+1 result:=R[y]=0
-
Result?
{горизонталь свободна}
i=1 to (x-1)
y-stek[i]=(x-1)?
-
+
Result:=false
Для вызывающей процедуры:
Процедура даст 1 решений (цикл). Если хотим получить все решения, то вместо break надо поставить вывод вектора решений с оператором принудительного продолжения вектора (continue)
Procedure Button1Click
y=1 to 8
R[y]=0
x=1; y=0
repeat
Uspech
Stek[x]=y
X=8
Break
- +
X=0
+ +
R[y]=1 x=x+1 y=0
Решение не найдено
-
Вывод решения
X=0
Repeat
+
End
Жадный алгоритм:
Type cotro=array[0..3] of integer;
Банкомат [0..3] const.Mam:array of currency=(5000,1000,500,100); col:array [0,3[ of integer = (100,150,200,250);
Function sum (s:currence):colvo; var i=integer; begin for i=0 to 3 do sum[i]=0; for i=0 to 3 do begin a:=s div(num[i]) if a=0 then continue else begin result[i]=a; s=s-a*nim[i]; col[i]:=col[i]-a; end; end; end;
Procedure TForm1.Button1Click (…) var b:currency /real; ss:colvo; begin b:=str to float (edit1.text); ss:=sum(b);