Модифікація алгоритму Дейкстри для ваг ребер, виведених із діапазону


10

Припустимо, у мене є спрямований графік з вагами ребра, виведеними з діапазону [1,,K] де K є постійним. Якщо я намагаюся знайти найкоротший шлях за допомогою алгоритму Дейкстри , як я можу змінити структуру алгоритму / даних та покращити часову складність до O(|V|+|E|) ?


Ви повинні більш конкретно: Яка ваша структура даних? І ви не можете отримати менше O(V+E) . Оглядові лекції.
jonaprieto

Тільки тому, що можливості для різної ваги краю невеликі, не означає, що кількість відстаней невелика.
Джо

3
Спочатку кольорові вершини вашого графіка синім, потім розділіть кожен край розміру t на t краї (додавши t1 незабарвлених вершин), потім запустіть BFS на цьому новому графіку, щоб знайти найкоротші шляхи від стартового вузла до синіх вузлів, це O(|V|+|E|) якщо у вас постійний k .

@SaeedAmiri чому б не написати це як відповідь?
Джо

@Joe, тому що це не модифікує dijkstra (принаймні безпосередньо не пов'язане з dijkstra).

Відповіді:


16

{0,1,,K}O(K|V|+|E|)

{D,D+1,,D+K}DDD+Kd[u]+wt(u,w)(u,w)d[u]ud[u]D

A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D

  • видалити-хв : В той час як порожній, приріст . Потім видаліть і поверніть вершину з .A[h(D)]DA[h(D)]

  • вставити за допомогою клавіші : Додайте вершину до відра .kA[h(k)]

  • клавіша зменшення до : перемістіть вершину від до .kkA[h(k)]A[h(k)]

Вставка та клавіша зменшення - це операції постійного часу, тому загальний час, проведений у цих операціях, буде . Загальний час , витрачений на Delete-хв буде плюс кінцеве значення . Кінцеве значення є максимальним (кінцеве) відстань від джерела до будь-якої вершини (так як видалення-хв , який приймає ітерацій зростає по ). Максимальна відстань - не більше оскільки кожен шлях має максимум ребер. Таким чином, загальний час, проведений алгоритмом, дорівнює .O(|V|+|E|)O(|V|)DDiDiK(|V|1)|V|1O(K|V|+|E|)


Мені подобається кругова черга, це набагато краще, ніж моя ідея в основному мати масив розміру K * v, де в будь-який момент часу використовується лише фрагмент розміру av.
rrenaud

Я реалізував його за допомогою подвійного зв'язаного списку, це все ще означає, що це O (1) для пошуку клавіші min?
user1675999

@ user1675999, я не впевнений. якщо ваш список відсортований за ключовими словами, як ви ефективно вставляєте та зменшуєте клавішу? якщо ваш список не відсортований за ключовими словами, як зробити видалення-хв ефективно?
Ніл Янг

5

Тут я припускаю, що - ціле число, а ваги ребер є цілісними. В іншому випадку він насправді нічого не купує, ви завжди можете змінити ваги, щоб мінімальна грань коштувала а максимальна - , тому проблема ідентична стандартній задачі з найкоротшим шляхом.K1K

Алгоритм / ескіз доказів: Реалізація черги пріоритетів таким шаленим способом як масивсписки, введені вартістю, і в іншому випадку використовують стандартний алгоритм Дікстра. Зберігайте лічильник, який відстежує вартість мінімального товару в купі. Вирішіть виклик декею після видалення елементів шляхом лінійного сканування . Так, цей вид звучить божевільно, але постійний дасть вам обдурити і обдурити вашу алгоритмічну інтуїцію проти лінійних сканувань. Сканувати потрібно лише з останнього маркера хвилини, оскільки алгоритм Disjkstra приємний до вашої реалізації черги. На той момент, коли він вимагає декетування, елементи, вставлені в чергу, завжди більше або рівні попередньому мінімуму. Найдовший найкоротший можливий шлях має довжинуK×|V|KK×|V|, тому ваша амортизована вартість сканування становить якщо K постійна.K×|V|=O(|V|)


-2

Ви можете використовувати топологічне сортування для пошуку рішення, нехай джерело матиме ступінь 0, тоді переходьте від кожного краю від джерела, якщо інша вершина має 0 градусів, тоді поставте її в чергу і продовжуйте робити це. у цьому випадку (без циклу всередині графіка) він може досягти V + E, як би проходив через кожну вершину та ребра один раз і лише один раз.


Здається, що не має відношення до питання? Питання не передбачає, що графік є ациклічним, і ваше рішення не використовує той факт, що ваги витягуються з постійного діапазону.
xskxzr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.