Эвристики для поиска кратчайших путей — различия между версиями
(→Многоуровневые корзины(multi-level buckets, MLB)) |
(→Многоуровневые корзины(multi-level buckets, MLB)) |
||
Строка 33: | Строка 33: | ||
{| border="1" cellspacing="0" cellpadding="5" align="right" | {| border="1" cellspacing="0" cellpadding="5" align="right" | ||
− | |+ Сравнение различных структур данных для поиска кратчайшего пути на карте Европы | + | |+ Сравнение различных структур данных для поиска кратчайшего пути на карте Европы (CPU 2,4GHz, 16MB RAM) |
! Структура данных !! Время работы (сек) | ! Структура данных !! Время работы (сек) | ||
|- | |- | ||
Строка 41: | Строка 41: | ||
|- | |- | ||
| 8-куча || 11,52 | | 8-куча || 11,52 | ||
+ | |- | ||
+ | | MLB || 9,36 | ||
+ | |- | ||
+ | | MLB + калибровка || 8,04 | ||
|- | |- | ||
|} | |} | ||
Строка 49: | Строка 53: | ||
* При релаксации будем убирать вершину из исходной корзины и класть в корзину, соответствующую новому значению <tex>dist(u)</tex> | * При релаксации будем убирать вершину из исходной корзины и класть в корзину, соответствующую новому значению <tex>dist(u)</tex> | ||
− | + | Можно заметить, что при такой реализации, все операции с приоритетной очередью будут выполняться за <tex>O(1)</tex>. Тогда, для одного уровня корзин время работы алгоритма Дейкстры можно оценить как <tex>O(m+nC)</tex>, где <tex>C</tex> - максимальная длина ребра в графе. | |
При двухуровневой реализации будем поддерживать два уровня корзин: первый уровень будет соответствовать одноуровневой реализации, а корзины второго уровня будут содержать диапазон значений корзин первого уровня, которые в них входят. | При двухуровневой реализации будем поддерживать два уровня корзин: первый уровень будет соответствовать одноуровневой реализации, а корзины второго уровня будут содержать диапазон значений корзин первого уровня, которые в них входят. | ||
Строка 55: | Строка 59: | ||
Соответственно, нам нужно поддерживать два индекса <tex>L_{top}</tex> и <tex>L_{bottom}</tex> для каждого из уровней соответственно. | Соответственно, нам нужно поддерживать два индекса <tex>L_{top}</tex> и <tex>L_{bottom}</tex> для каждого из уровней соответственно. | ||
− | При такой реализации, время работы алгоритма Дейкстры можно оценить как <tex>O(m+n(1+sqrt | + | При такой реализации, время работы алгоритма Дейкстры можно оценить как <tex>O(m+n(1+ \sqrt{C}))</tex> |
===Калибровка(caliber)=== | ===Калибровка(caliber)=== | ||
Введём величину "калибр" вершины <tex>v</tex>- вес минимального ребра, входящего в <tex>v</tex>. | Введём величину "калибр" вершины <tex>v</tex>- вес минимального ребра, входящего в <tex>v</tex>. |
Версия 14:39, 3 декабря 2013
Данная статья - перевод выступления Renato F. Werneck в Microsoft Data Structures and Algorithms School в 2010 году.
Содержание
Проблема поиска кратчайшего пути
Дано:
- ориентированный граф
- отправная точка - вершина , пункт назначения - вершина
Цель: найти кратчайший путь
Мы будем рассматривать сеть автомобильных дорог:
- - множество перекрёстков
- - множество дорог
- - среднее время, которое занимает проезд по дороге
Алгоритм Дейкстры
основная статья: Алгоритм Дейкстры
- на каждом шаге выбирает из множества непросмотренных вершин вершину с наименьшим расстоянием до старта и релаксирует рёбра, исходящие из неё
- завершает свою работу, когда цель достигнута (или просмотрены все вершины)
Скорость работы алгоритма Дейкстры сильно зависит от скорости операций с приоритетной очередью.
Поскольку мы рассматриваем сеть автомобильных дорог, то
(граф планарен почти везде).Для фибоначчиевых куч время работы алгоритма составляет
, для двоичных куч:Но на практике чаще используются 2-, 4- и 8-ичные кучи: они более простые, оценка времени работы содержит меньшее количество скрытых констант.
Улучшения алгоритма Дейкстры
Многоуровневые корзины(multi-level buckets, MLB)
Структура данных | Время работы (сек) |
---|---|
Двоичная куча | 12,38 |
4-куча | 11,53 |
8-куча | 11,52 |
MLB | 9,36 |
MLB + калибровка | 8,04 |
Подходит только графов с целочисленными рёбрами.
- Будем складывать вершины в "корзины"
- Наша структура данных будет поддерживать индекс
- На каждом шаге алгоритма, если пусто, то увеличим , а иначе достанем одну вершину из
- При релаксации будем убирать вершину из исходной корзины и класть в корзину, соответствующую новому значению
Можно заметить, что при такой реализации, все операции с приоритетной очередью будут выполняться за
. Тогда, для одного уровня корзин время работы алгоритма Дейкстры можно оценить как , где - максимальная длина ребра в графе.При двухуровневой реализации будем поддерживать два уровня корзин: первый уровень будет соответствовать одноуровневой реализации, а корзины второго уровня будут содержать диапазон значений корзин первого уровня, которые в них входят.
Соответственно, нам нужно поддерживать два индекса
и для каждого из уровней соответственно.При такой реализации, время работы алгоритма Дейкстры можно оценить как
Калибровка(caliber)
Введём величину "калибр" вершины
- вес минимального ребра, входящего в .