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

Алгоритм Дейкстры (Dijkstra)

Алгоритм Дейкстры предназначен для нахождения кратчайших путей от одной вершины взвешенного графа до всех остальных вершин. Пусть граф представлен в виде матрицы смежности A[N][N] (определенной как в алгоритме Флойда) и необходимо найти кратчайшие пути из вершины с номером start. Алгоритм использует тот факт, что любая часть кратчайшего пути сама является кратчайшим путем между соотвествующими вершинами.

Создадим массив длин путей d[N], в каждом элементе которого будем хранить длину кратчайшего (из известных на текущий момент) пути от start до соответствующей вершины. Изначально d[start] = 0 и d[i] равно бесконечности для всех i != start. Создадим также массив used[N] и заполним его нулями. Алгоритм может быть сформулирован следующим образом:

Из всех неиспользованных вершин (все i такие, что used[i] == 0) выберем вершину с минимальным d[i], не равным бесконечности. Обозначим эту вершину как curr. Если выбрать такую вершину невозможно, завершим выполнение алгоритма.

Пометим вершину curr как использованную, присвоив used[curr] = 1.

Для каждой неиспользованной вершины i сравним значение d[i] с суммой d[curr] + A[curr][i]. Если d[i] > d[curr] + A[curr][i], то присвоим d[i] = d[curr] + A[curr][i].

Перейдем к шагу 1.

После выполнения алгоритма массив d будет содержать длины кратчайших путей от вершины start до всех остальных вершин. В случае, если до какой-либо вершины невозможно добраться из вершины start, соответствущий элемент массива d будет равен бесконечности.

Для определения кратчайших путей необходимо ввести еще один одномерный массив c[N]. Пусть первоначально он заполнен числами -1. В шаге 3 алгоритма Дейкстры, делая присваивание

d[i] = d[curr] + A[curr][i],

будем изменять значение c[i]:

с[i] = curr.

После окончания алгоритма значение c[i] будет указывать вершину, предпоследнюю в кратчайшем пути от start до i, и сам путь восстанавливается простым циклом.

Алгоритм Дейкстры требует O(N2) времени для работы при реализации на матрице смежности (время можно улучшить, если пользоваться другими структурами данных для хранения графа). Для корректной работы алгоритма необходимо, чтобы в графе отсутствовали ребра с отрицательными весами.

2.  Процедурные типы. Передача функций как параметров.

В Турбо Паскале можно передавать в процедуры и функции имена других подпрограмм, оформляя их как параметры. И точно так же, как передавались данные, могут передаваться методы их обработки. Это особенно важно при программной реализации алгоритмов вычислительной математики и ряда других областей. Например, можно написать процедуру численного интегрирования произвольной функции а f(t), инвариантную к конкретному виду этой функции.

В целом использование параметров процедурного типа повышает компактность и структурированность программ, делает их алгоритм более ясным и логичным.

Параметром подпрограммы может быть процедура или функция, т.е. параметр процедурного типа. Такие параметры описываются как параметры-значения, т.е. без зарезервированного слова var. В качестве фактического параметра используется конкретная процедура или функция, имеющая соответствующее количество параметров требуемых типов.

Для параметров-процедур и параметров-функций существуют те же правила, что и для других переменных процедурного типа: подпрограммы должны компилироваться с ключом {$F+} или иметь директиву far, не должны быть стандартными подпрограммами, не должны объявляться внутри других подпрограмм.

Билет 23

1 ВОПРОС: Передача параметров вызываемым программам.

В заголовке подпрограммы может быть задан список формальных параметров. Каждый параметр, заданный в заголовке, считается локальным в данной подпрограмме. Идентификаторы формальных параметров можно считать условными обозначениями реальных (фактических) параметров, которые будут переданы в подпрограмму при её вызове.

Внимание: Типы формальных параметров должны обязательно обозначаться идентификаторами.

Недопустимо: Procedure InCorrect (Var A: Array [1..10] of Byte);

Нужно: Type

MyArray = Array [1..10] of Byte;

Procedure Correct (Var A: MyArray);

Допустимы по крайней мере три способа задания формальных параметров:

параметры, перед которыми отсутствует служебное слово Var и за которыми следует идентификатор типа;

параметр, перед которым Var и далее тип;

параметр со словом Var и не имеющие типа.

Эти три способа задания формальных параметров отражают три различных способа передачи параметров a - по значению; b - по ссылке; c - передача нетипизированных параметров по ссылке (b, c - параметры-переменные).

Параметры - значения.

Наиболее распространенный и простой способ. Параметр - обычная локальная переменная. Может использовать выражение. Любые действия внутри подпрограммы никак не отражаются на значениях переменной вне подпрограммы.

Параметры - переменные.

Передаются по ссылке. Способ используется, когда необходимо передать некоторое значение в точку вызова подпрограммы. В случае Var - формальные параметры считаются синонимами соответствующих фактических параметров. При этом фактические параметры должны быть переменными (не выражениями) того же типа, что и формальные параметры:

Procedure Swap (Var X,Y: Real);

Var

T: Real;

Begin

T:= X;

X:= Y;

Y:= T;

End;

Переменные файловых типов могут передаваться в подпрограмму только как параметры - переменные.

2 ВОПРОС: Объект. Свойства объектов

Объект — некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеет заданные значения свойств (атрибутов) и операций над ними (методов). Термин объект в программном обеспечении впервые был введен в языке Simula и применялся для моделирования реальности. Объект обладает состоянием, поведением и идентичностью; структура и поведение схожих объектов определяет общий для них класс; термины «экземпляр класса» и «объект» взаимозаменяемы. Имя объекта начинается обычно со строчной буквы. Анонимный объект — это объект который принадлежит некоторому классу, но не имеет имени. Инициализация— присвоение начальных значений полям объекта. Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой. При применении свойств можно задать значение по умолчанию, которое будет хранится в данном свойстве (или указать, что никакого значения по умолчанию не предполагается); можно указать, что это свойство только для чтения. Как правило, свойство связано с некоторым внутренним полем (переменной) объекта. Но свойству вообще может не быть сопоставлена ни одна переменная объекта, хотя пользователь данного объекта имеет дело с ним так, как если бы это было настоящее поле. Свойства повышают гибкость и безопасность программирования, поскольку, являясь частью (открытого) интерфейса, позволяют менять внутреннюю реализацию объекта без изменения его свойств. По своей сути, свойства предназначены для того, чтобы свести программирование к операциям над свойствами, скрывая вызовы методов.

Свойства в Delphi Для описания свойства в Delphi служит слово property.

Пример класса со свойством:

TMyClass = class

private

FMyField: Integer;

procedure SetMyField(const Value: Integer);

function GetMyField: Integer;

public

property MyField: Integer read GetMyField write SetMyField;

end;

function TMyClass.GetMyField: Integer;

begin

Result := FMyField;

end;

procedure TMyClass.SetMyField(const Value: Integer);

begin

FMyField := Value;

end;

Билет 24

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