Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм Дейкстры за O(nlog(m)) 
:(
    Опции темы
altairaimenov
Дата 21.5.2015, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.3.2015

Репутация: нет
Всего: нет



Вот собственно ещё одна тема и надеюсь не последняя. Я умею писать алгоритм дейкстры(http://e-maxx.ru/algo/dijkstra), но он работает неэффективно за O(n^2+m).Слышал что существует дейкстра кучей(heap) за O(nlogm). Если кто-нибудь знает объясните пожалуйста...
PM MAIL   Вверх
baldina
Дата 21.5.2015, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



если на каждом шаге проводить не линейный поиск вершины с наименьшим весом, а пользоваться специальной структурой, алгоритм будет эффективнее. heap - пирамида (сбалансированное двоичное дерево определенного вида, обычно уложенное в массив), на основе которой естественным образом реализуется очередь с приоритетом (доступ к минимальному элементу O(1), удаление минимального O(logN))
heap
алгоритм дейкстры (включает обсуждение производительности)
реализация может быть основана на обобщенном обходе графа, основанном на очереди с приоритетом (dfs основан на стеке, bfs - на очереди, обобщенный - на произвольном контейнере). технически можно использовать bfs, заменив очередь на heap.

Добавлено через 5 минут и 6 секунд
собственно, алгоритм дейкстры не что-то там особенное, а именно обобщенный обход на очереди с приоритетом, использующий для пометки вершины значение длины пути. к сожалению такую формулировку практически не используют...
PM MAIL   Вверх
altairaimenov
Дата 22.5.2015, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.3.2015

Репутация: нет
Всего: нет



Цитата(baldina @ 21.5.2015,  22:57)
если на каждом шаге проводить не линейный поиск вершины с наименьшим весом, а пользоваться специальной структурой, алгоритм будет эффективнее. heap - пирамида (сбалансированное двоичное дерево определенного вида, обычно уложенное в массив), на основе которой естественным образом реализуется очередь с приоритетом (доступ к минимальному элементу O(1), удаление минимального O(logN))
heap
алгоритм дейкстры (включает обсуждение производительности)
реализация может быть основана на обобщенном обходе графа, основанном на очереди с приоритетом (dfs основан на стеке, bfs - на очереди, обобщенный - на произвольном контейнере). технически можно использовать bfs, заменив очередь на heap.

Добавлено @ 23:02
собственно, алгоритм дейкстры не что-то там особенное, а именно обобщенный обход на очереди с приоритетом, использующий для пометки вершины значение длины пути. к сожалению такую формулировку практически не используют...

Получается,что я могу находить минимальное ребро за О(1) строя при этом min-кучу, но разве это будет не долго строить для каждой вершины heap?

Это сообщение отредактировал(а) altairaimenov - 22.5.2015, 07:29
PM MAIL   Вверх
altairaimenov
Дата 22.5.2015, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.3.2015

Репутация: нет
Всего: нет



И также я прочитав статью, не понял функцию heapify(https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D1%83%D1%87%D0%B0)

Heapify(A, i)
  left ← 2i
  right ← 2i+1
  heap_size - количество элементов в куче
  largest ← i
  if left ≤ A.heap_size и A[left] > A[i]
    then largest ← left
  if right ≤ A.heap_size и A[right] > A[largest]
    then largest ← right
  if largest ≠ i
    then Обменять A[i] ↔ A[largest]
         Heapify(A, largest)

Ведь может быть так, что когда мы меняем местами нашего сына и предка, то может получиться так,что наш нынешний предок окажется больше своего предка, но функция этого не проверяет или я где-то не правильно понял?
Вот допустим у меня изменен элемент a[i], Я послал функцию heapify(a,i). И допустим,что он оказался больше своих сыновей.Функция это проверит и выйдет.Но ведь его предок (i/2) может быть меньше его.

P.s. это все относится к max-куче

PM MAIL   Вверх
baldina
Дата 22.5.2015, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Heapify применяется к массиву, где нарушено положение не более одного элемента
Цитата

Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему.


Добавлено через 2 минуты и 3 секунды
Цитата(altairaimenov @  22.5.2015,  07:53 Найти цитируемый пост)
Вот допустим у меня изменен элемент a[i]

в куче не меняются произвольные элементы. либо удаляется корневой элемент, либо добавляется новый.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.