Чи відома ця щільна версія алгоритму Крускала?


15

Близько року тому ми з другом придумали спосіб реалізувати алгоритм Крускала для щільних графіків у кращій формі, ніж звичайний О(мжурналм) пов'язаний (не передбачаючи попередньо відсортованих ребер). Зокрема, ми досягаємо Θ(н2) у всіх випадках, подібних до Prim, коли реалізуються за допомогою матриць суміжності.

Я написав трохи про алгоритм у своєму блозі , включаючи код C ++ та орієнтири, але ось загальна ідея:

  • Підтримуйте один представницький вузол для кожного підключеного компонента. Спочатку всі вузли представляють себе.

  • Підтримуйте вектор dist[i]таким, що для кожного компонента iмає найлегший край, що стикається з перетином компонента i.

  • Знайшовши найлегший край, який перетинає перегородки, просто знайдіть, iщо мінімізує вагу dist[i], за лінійний час.

  • cicjААi,к=хв{Аi,к,Аj,к}кij

Таким чином, стиснення найлегшого краю і знаходження згаданого краю може бути здійснено за лінійний час. Робимо це раз, щоб знайти MST. Потрібно трохи бухгалтерії, щоб фактично знайти, який край ми хочемо додати до MST, але це не збільшує складність. Таким чином, час виконання - . Реалізація - це лише пара циклів.н-1Θ(н2)

Чи відома ця версія Крускала в літературі?

Відповіді:


19

Я не впевнений у цьому конкретному методі досягнення часу , але два різні способи виконання Крускала за час наведені в моїй роботі "Швидке ієрархічне кластеризація та інші програми динамічних найближчих пар "(SODA 1998, arXiv: cs.DS / 9912014 та J. експериментальні алгоритми 2000):О(н2)О(н2)

  1. Використовуйте замість Prim – Dijkstra – Jarník і потім сортуйте краї, щоб отримати послідовність вставки, яку подав би Крускал, або

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

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

Як я писав у 2011 році в статті Вікіпедії про алгоритм найближчого сусіднього ланцюга , цей алгоритм також може бути використаний для виконання Крускала за час. Однак (на відміну від деяких інших застосувань алгоритму ланцюга найближчого сусіда) ви не отримуєте економію простору, тому (як метод квадратури та ваш метод) простір все ще є . На відміну від сортування Prim +, можна використовувати лише простір, що перевищує необхідний для зберігання вхідних даних.О(н2)О(н2)О(н)

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