
- •Полустатические структуры данных
- •4.1. Характерные особенности полустатических структур
- •4.2. Строки
- •4.2.1. Логическая структура строки
- •4.2.2. Операции над строками
- •4.2.3. Представление строк в памяти
- •Динамические структуры данных. Связные списки
- •5.1. Связное представление данных в памяти
- •5.2. Стеки
- •5.2.1. Логическая структура стека
- •5.2.2. Машинное представление стека и реализация операций
- •5.2.3. Стеки в вычислительных системах
- •5.3. Очереди fifo
- •5.3.1. Логическая структура очереди
- •5.3.2. Машинное представление очереди fifo и реализация операций
- •5.3.3. Очереди с приоритетами
- •5.3.4. Очереди в вычислительных системах
- •5.4. Деки
- •5.4.1. Логическая структура дека
- •5.4.2. Деки в вычислительных системах
- •5.5. Связные линейные списки
- •5.5.1. Машинное представление связных линейных списков
- •5.5.2. Реализация операций над связными линейными списками
- •5.5.3. Применение линейных списков
- •5.6 Мультисписки
- •5.7. Нелинейные разветвленные списки
- •5.7.1. Основные понятия
- •5.7.2. Представление списковых структур в памяти
- •5.7.3. Операции обработки списков
- •5.8. Управление динамически выделяемой памятью
- •6. Деревья
- •6.1. Бинарные деревья
- •6.2. “Прошитые” деревья
- •6.3. Графы
- •6.4. Алгоритмы поиска путей в графе
- •6.4.1. Путь с минимальным количеством промежуточных вершин (волновой алгоритм)
- •6.4.2. Путь минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Дейкстры)
- •6.4.3. Путь минимальной суммарной длины во взвешенном графе с произвольными весами для всех пар вершин (алгоритм Флойда)
- •6.4.4. НахождениеKпутей минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Йена)
- •7. Классы и объекты
- •8. Рекурсия
- •8.1. Некоторые задачи, где можно применить рекурсию
- •8.2. Использование рекурсии в графике
- •8.2.1. Кривые Гильберта
- •8.2.2. Кривые Серпинского
- •9. Алгоритмы Сжатия информации
- •9.1. Что такое архивирование и зачем оно нужно
- •9.2. Терминология
- •9.3. Методы кодирования
- •9.4. Модели входного потока
- •9.5. Моделирование и энтропия
- •9.6. Адаптированные и неадаптированные модели
- •9.7. Алгоритмы архивации данных
- •9.8. Сжатие способом кодирования серий (rle)
- •9.9. Алгоритм Хаффмана
- •9.10. Арифметическое кодирование
- •9.11. Алгоритм Лемпеля-Зива-Велча (Lempel-Ziv-Welch - lzw)
- •9.11.1. Двухступенчатое кодирование. Алгоритм Лемпеля-Зива
- •Библиографический Список
- •Оглавление
6.4.3. Путь минимальной суммарной длины во взвешенном графе с произвольными весами для всех пар вершин (алгоритм Флойда)
Функция находит пути минимального веса в графе G=(V,E), заданном весовой матрицей w, у которой элемент wi j равен весу ребра, соединяющего i-ю и j-ю вершины. При этом полагаем, что W[i,i]=0 для всех i. Путь ищется для всех пар вершин графа. Для бесконечности используется число GM, его можно задавать в зависимости от конкретной задачи.
Следует заметить, что если в графе существует контур отрицательной сумарной длины, то вес любого пути, проходящего через вершину из этого контура, можно сделать сколь угодно малой, "прокрутившись" в контуре необходимое количество раз. Поэтому поставленная задача разрешима не всегда. В случае, описанном выше, алгоритм Флойда прекращает свою работу. Останавливаясь подробнее, надо заметить, что если граф неориентированный (W[i,j]- симметрична), то ребро с отрицательным весом является как раз таким контуром (туда-сюда можно бегать пока не сделаем вес достаточно малым)
Алгоритм Флойда предполагает последовательное преобразование матрицы весов W. В конечном итоге получаем матрицу, элементы d[i,j] которой представляют из себя вес минимального пути соединяющего i и j вершины. Рассмотрим преобразования матрицы весов:
D0=W
dm+1[i,j]=min{dm[i,j], dm[i,(m+1)] + dm[(m+1),j]},
где i<>j; dm+1[i,i]=0.
Преобразование проделывается для m=1..n, где n - мощность множества вершин графа. Если на некотором шаге получим отрицательное dm[i,m]+dm[m,i] для какого-нибудь i, то в графе существует контур отрицательного веса, проходящий через вершину i, и задача не разрешима.
На выходе получаем матрицу D минимальных весов и матрицу P, при помощи которой можно востановить путь минимального веса следующим образом: значение p[i,j] будет равно номеру предпоследней вершины в пути между i и j (либо p[i,j]=i, если путь не существует). Переменная s на выходе равна 1, если алгоритм отработал полностью, и нулю, если в ходе работы алгоритма найден контур отрицательного веса. Заметим, что если граф неориентированный, то W, а также все матрицы получаемые в результате преобразований, симметричны и, следовательно, достаточно вычислять только элементы, расположенные выше главной диагонали.
6.4.4. НахождениеKпутей минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Йена)
Алгоритм предназначен для нахождения К путей минимальной длины во взвешенном графе между вершинами u1,u2. Ищутся пути, которые не содержат петель. Итак, задача состоит в отыскании нескольких минимальных путей, поэтому возникает вопрос о том чтобы не получить путь, содержащий петлю, в случае поиска одного пути минимального веса это условие выполняется по необходимости, в данном же случае мы используем алгоритм Йена, позволяющий находить K кратчайших простых цепей.
Работа алгоритма начинается с нахождения кратчайшего пути, для этого будем использовать уже описанный алгоритм Дейкстры. Второй путь ищем, перебирая кратчайшие отклонения от первого, третий - кратчайшие отклонения от второго, и т.д.
Более точное пошаговое описание:
1. Найти минимальный путь P1=(v11,...,v1L[1]). Положить k = 2. Включить P1 в результирующий список.
2. Положить MinW равным бесконечности. Найти отклонение минимального веса от (k–1)-го кратчайшего пути Pk-1 для всех i=1,2,...,L[k-1], выполняя для каждого i шаги с 3-го по 6-й.
3. Проверить, совпадает ли подпуть, образованный первыми i вершинами пути Pk-1, с подпутем, образованным первыми i вершинами любого из путей j=1,2,...,k–1). Если да, положить W[vk-1i,vji+1] равным бесконечности, в противном случае ничего не изменять (чтобы в дальнейшем исключить получение в результате одних и тех же путей). 4. Используя алгоритм нахождения кратчайшего пути, найти пути от vk-1i к u2, исключая из рассмотрения корни (vk-11,...,vk-1i) (чтобы исключить петли), для этого достаточно положить равными бесконечности элементы столбцов и строк матрицы W, соответствующие вершинам, входящим в корень.
5. Построить путь, объединяя корень и найденное кратчайшее ответвление; если его вес меньше MinW, то запомнить его.
6. Восстановить исходную матрицу весов W и возвратиться к шагу 3. 7. Поместить путь минимального веса (MinW), найденный в результате выполнения шагов с 3 по 6, в результирующий список. Если k = K, то алгоритм заканчивает работу, иначе увеличить k на единицу и вернуться к шагу 2.
Алгоритм использует массив p для результирующего списка путей, и массив l для хранения соответствующих длин, при этом, если начиная с некоторого i элементы l[i] равны -1, значит существует только i-1 кратчайших путей без петель.