Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / Struktury.docx
Скачиваний:
37
Добавлен:
04.04.2018
Размер:
2.84 Mб
Скачать

Структура данных для описания решетки.

Удельные затраты меняем на алгоритмы. Для описания решения применяем динамических массив.

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);

Соседние файлы в папке Лекции