
- •1. Условный оператор, оператор выбора
- •5. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов.
- •2. Операторы организации циклов
- •3. Обработка двумерных массивов.
- •4. Процедуры и функции
- •37. Алгоритмы генерирования k-элементных подмножеств множества
- •6. Использование множеств для решения задач
- •7. Процедуры и функции обработки строк
- •8. Сортировка и поиск информации. Методы внутренней сортировки: Сортировка «пузырек»
- •9.Сортировка подсчетом.
- •10.Сортировка простым обменом
- •11. Методы внутренней сортировки: «Шейкер-сортировка»
- •12. Методы внутренней сортировки: Сортировка «Хаора»
- •14. Методы внутренней сортировки: Пирамидальная сортировка
- •16.Сортировка бинарными вставками
- •17. Методы внутренней сортировки: Сортировка «Шелла»
- •15 Сортировка простыми вставками.
- •19.Чтение типизированных файлов
- •18. Сортировка слиянием
- •20.Алгоритмы удаления записей типизированного файла.
- •19.Сортировка естественным слиянием.
- •28. Динамическая структура очередь, ее создание и использование.
- •20. Поразрядная сортировка
- •32. Деревья: построение бинарного дерева
- •52.Чтение типизированных файлов
- •21. Рекуррентные выражения. Рекурсия: прямая и косвенная.
- •22.Стандартные процедуры и функции Unit Graph.
- •53.Алгоритмы удаления записей типизированного файла.
- •27. Динамическая структура стек, ее создание и использование.
- •34. Алгоритмы генерирования перестановок (антилексикографическом порядке )
- •29. Списки: односвязные
- •33. Алгоритм генерирования перестановок в лексикографическом порядке.
- •30.Списки: двухсвязные
- •31. Динамическая структура кольцо, ее создание и использование.
- •34. Алгоритмы генерирования перестановок
- •51. Создание типизированных файлов.
- •36. Алгоритмы генерирования множества всех подмножеств
- •65. Создание таблиц базы данных с помощью Database Desktop.
- •38. Введение в теорию графов. Способы представления ориентированных и неориентированных графов: матрицы смежности
- •39. Поиск в ширину в графе
- •40. Поиск в глубину в графе
- •41,42. Построение остовного дерева графа.
- •43. Поиск кратчайшего пути в графе (Алгоритм Дейкстры)
- •44.Алгоритм Форда поиска кратчайших расстояний в графе.
- •45.Алгоритм Флойда поиска кратчайших расстояний в графе.
- •46. Алгоритмы с возвращением, их реализация с помощью рекурсий и динамических структур. Примеры алгоритмов с возвращением.
- •50.Типизированные файлы, их назначение и использование. Основные процедуры обработки типизированных файлов
- •47,48. Типы файлов, объявление, логическая и физическая организация файловой системы, процедуры и функции обработки файлов
- •67,68 Компоненты страниц Data Access, Data Controls. Создание базы данных, псевдонима бд
- •62 Компоненты страницы Samples, их назначение, свойства, примеры применения
- •56.Полиморфизм. Виртуальные методы. Таблица виртуальных методов
- •54.Понятие объекта.(класса). Инкапсуляция. Иерархия классов (типов). Правила наследования
- •57. Компоненты страницы Standard, их назначение, свойства, примеры применения.
- •49. Нетипизированные файлы
- •58.Компоненты страницы Additional, их назначение, свойства, примеры применения
- •1. TBitBtn
- •2. TSpeedButton
- •3. TMaskEdit
- •4. TDrawGrid
- •60. Компоненты страницы System, их назначение, свойства, примеры применения
- •71. Создание справочной системы
- •61,. Компоненты страницы Dialogs их назначение, свойства, примеры применения
- •63. Задание и изменение свойств компонентов с помощью Инспектора объектов и программно
- •64. Обработка событий, связанных с использованием компонентов.
- •70. Мультимедийные возможности Delphi
- •66. Создание и использование модуля данных Data Module.
- •69. Графические возможности Delphi
39. Поиск в ширину в графе
Теперь рассмотрим несколько иной метод поиска в графе, называемый поиском в ширину(англ.:Breadth first search). Прежде чем описать его, отметим, что при поиске в глубину, чем позднее будет посещена вершина, тем раньше она будет использована - точнее, так будет при допущении, что вторая вершина посещается перед использованием первой. Это прямое следствие того факта, что просмотренные, но ещё не использованные вершины скапливаются в стеке. Поиск в ширину, грубо говоря, основывается на замене стека очередью. После такой модификации чем раньше посещается вершина (помещается в очередь),тем раньше она используется (удаляется из очереди).Использование вершины происходит с помощью просмотра сразу всех ещё не просмотренных соседей этой вершины. Вся процедура представлена ниже
Procedure WG1[v];
(*поиск в ширину в графе с началом в вершине v;*);
Переменные НОВЫЙ, ЗАПИСЬ – глобальные*)
Begin
ОЧЕРЕДЬ:=0; ОЧЕРЕДЬ←v; НОВЫЙ[v]:=ложь
While ОЧЕРЕДЬ≠0 do
Begin P←ОЧЕРЕДЬ; посетить р
For u ЗАПИСЬ[p] do
If НОВЫЙ [u] then
Begin ОЧЕРЕДЬ ← u; НОВЫЙ [u]:=ложь
End
End
End
Способом, аналогичным тому, какой был применён для поиска в глубину, можно легко показать, что вызов процедуры WS(u) приводит к посещению всех вершин связной компоненты графа, содержащей вершину U, причём каждая вершина просматривается в точности один раз. Вычислительная сложность поиска в ширину также имеет порядок M+n, так как каждая вершина помещается в очередь и удаляется из очереди в точности один раз, а число итераций цикла 6,очевидно, будет иметь порядок числа ребер графа. Оба вида поиска в графе:в глубину и в ширину могут быть использованы для нахождения пути между фиксированными вершинами V и U. Достаточно начать поиск в графе с вершины V и вести его до момента посещения вершины U. Преимуществом поиска в глубину является тот факт, что в момент посещения вершины U стек содержит последовательность вершин, определяющую путь из V в U. Это становится очевидным, если отметить, что каждая вершина, помещается в стек. Однако недостатком поиска в глубину является то, что полученный таким образом путь в общем случае не будет кратчайшим путем из V в U.
От этого недостатка избавлен метод нахождения пути, основанный на поиске в ширину. Модификация процедуры WS, замена строк 7..9 на
If НОВЫЙ [u] then
Begin ОЧЕРЕДЬ ← u; НОВЫЙ [u]:=ложь;
ПРЕДЫДУЩИЙ [u]:=p
end
По окончании работы модифицированной таким образом процедуры таблица ПРЕДЫДУЩИЙ содержит для каждой просмотренной вершины u вершину ПРЕДЫДУЩИЙ(U),из которой мы попали в u. Отметим, что кратчайший путь из U в v обозначается последовательностью вершин u=u1, u2,...,uk=v, где ui+1=ПРЕДЫДУЩИЙ[ui] для 1<=i<k и к является первым индексом i, для которого ui=v. Действительно, в очереди помещены сначала вершины, находящиеся на расстоянии 1 от v, и т.д. Под расстоянием здесь мы понимаем длину кратчайшего пути. Предположим теперь, что мы уже рассмотрели все вершины, находящиеся на расстоянии, не превосходящем r,от V, что очередь содержит все вершины, находящиеся от V на расстоянии r ,и только эти вершины и что таблица ПРЕДЫДУЩИЙ правильно определяет кратчайший путь от каждой, уже просмотренной вершины до V способом, описанным выше. Использовав каждую вершину r, находящёюся в очереди, наша процедура просматривает некоторые новые вершины, и каждая такая новая вершина u находится, очевидно, на расстоянии r+1 от V причем, определяя предыдущий [u]:=p, мы продлеваем кратчайший путь от р до v до кратчайшего пути от u до V .После использования всех вершин из очереди, находящихся на расстоянии r от V,она(очередь),очевидно, содержит множество вершин, находящихся на расстоянии r+1 от v,и легко заметить, что условие индукции выполняется и для расстояния r+1.