Коли я повинен використовувати Kruskal на відміну від Prim (і навпаки)?


194

Мені було цікаво, коли слід використовувати алгоритм Прима та коли Крускал, щоб знайти дерево, що мінімумує? Вони мають просту логіку, найгірші випадки, і різниця полягає лише у впровадженні, яке може включати трохи різні структури даних. Отже, що є вирішальним фактором?

Відповіді:


201

Використовуйте алгоритм Прима, коли у вас є графік з великою кількістю ребер.

Для графа з ребрами V вершин E алгоритм Крускала працює в час O (E log V), а алгоритм Прима може виконуватись в O (E + V log V) амортизований час, якщо ви використовуєте Купу Фібоначчі .

Алгоритм Прима значно швидше в межі, коли у вас дійсно щільний графік з набагато більшою кількістю ребер, ніж вершини. Крускал краще в типових ситуаціях (розріджені графіки), оскільки використовує простіші структури даних.


8
Я б сказав "типові ситуації" замість середнього .. Я думаю, що це невідомий термін для використання, наприклад, що таке "середній розмір" хеш-таблиці? не маю уявлення.
yairchu

2
@SplittingField: я вважаю, ви порівнюєте яблука та апельсини. Амортизований аналіз - це простий спосіб отримання вимірювання функції (так би мовити) --- чи це найгірший випадок, чи середній випадок залежить від того, що ви доказуєте. Насправді (як я зараз це шукаю), у статті wiki використовується мова, яка означає, що її використовується лише для аналізу в гіршому випадку. Тепер використання такого аналізу означає, що ви не можете давати настільки сильних обіцянок щодо вартості певної операції, але до того часу, коли алгоритм буде виконаний, це дійсно буде O (E + VlogV), навіть у гіршому випадку.
agorenst

10
Це теоретично звучить добре, але я думаю, що мало хто може реалізувати купу Фібоначчі
Александру

2
@tgamblin, у найгіршому випадку можуть бути C (V, 2) ребра. Отже, чи не повний час алгоритму Прима не зводиться до O (V ^ 2 + VlogV), тобто O (V ^ 2) у випадку нагромадження маси?
Зелений гоблін

7
Також є ще один важливий фактор: вихід прайменів є MST лише у тому випадку, якщо графік підключений (вихід мені здається не потрібним інакше), але вихід Крускала - це мінімальний ліс, що охоплює (з деяким використанням).
Андрій І

102

Я знайшов дуже гарну тему в мережі, яка пояснює різницю дуже просто: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Алгоритм Крускала виростить рішення з найдешевшого краю, додавши наступний найдешевший край за умови, що він не створює цикл.

Алгоритм Прима виростить рішення з випадкової вершини, додавши наступну найдешевшу вершину, вершину, яка наразі не знаходиться в рішенні, але пов'язана з нею найдешевшим краєм.

Тут додається цікавий аркуш на цю тему.введіть тут опис зображеннявведіть тут опис зображення

Якщо ви реалізуєте як Kruskal, так і Prim, в їх оптимальній формі: при знаходженні об'єднання і купі фінбоначок відповідно, ви відзначите, як Kruskal легко реалізувати порівняно з Prim.

Prim важче з групою філів, головним чином тому, що вам потрібно вести таблицю обліку для запису двонаправленого зв’язку між вузлами графіків і купами вузлів. З Union Union - це навпаки, структура проста і може навіть створювати безпосередньо mst майже без додаткових витрат.


2
Nitpick: Останній "слайд" у кожному повинен читати "повторити, поки у вас не буде розкинутого дерева"; не до MST, що є чимось рекурсивним завданням - як я знаю, що це мінімально - саме тому я слідую за Примом / Крускалом для початку!
OJFord

@OllieFord Я знайшов цю тему для пошуку простої ілюстрації алгоритмів Prim та Kruskal. Алгоритми гарантують, що ви знайдете дерево і це дерево є MST. І ти знаєш, що ти знайшов дерево, коли маєш точно V-1 краї.
mikedu95

@ mikedu95 Ви маєте рацію, вказуючи ту саму думку, що і мій попередній коментар, з іншого боку.
OJFord

Але хіба не передумовою є те, що вам потрібно вибирати лише однією вагою між вершинами, ви не можете вибирати вагу 2 більше, ніж один раз із наведеного вище графіка, ви повинні вибрати наступну вагу, наприклад: 3 @Snicolas
ani0904071

30

Я знаю, що ви цього не просили, але якщо у вас є більше одиниць обробки, ви завжди повинні враховувати алгоритм Borůvka , тому що він може бути легко паралельний - отже, він має перевагу в порівнянні з алгоритмом Kruskal та Jarník-Prim.


23

Крускал може мати кращі показники, якщо краї можна сортувати за лінійним часом або вже відсортовано.

Прайм краще, якщо кількість ребер до вершин велика.


19

Найгірший випадок за часом Крускаля - це O (E log E) , тому що нам потрібно сортувати краї. Найгірший випадок складності в первинному часі - це O (E log V) з чергою пріоритетів або навіть краще, O (E + V log V) з фібоначчовою купою . Ми повинні використовувати Крускал, коли графік розріджений, тобто невелика кількість ребер, як E = O (V), коли ребра вже відсортовані або якщо ми можемо їх сортувати за лінійним часом. Ми повинні використовувати Prim, коли графік щільний, тобто кількість ребер висока, як E = O (V²).


Мені здається, що Прайм ніколи не гірший за швидкість Крускала. Оскільки E повинно бути принаймні V-1, є дерево, що охоплює. Я думаю, що причина, чому ми можемо віддавати перевагу Крускалу для розрідженого графіка, полягає в тому, що його структура даних є простою.
Ю Гу

16

Якщо ми зупинимо алгоритм у середині prim, алгоритм завжди генерує пов'язане дерево, але kruskal з іншого боку може дати відключене дерево або ліс


5

Одним із важливих застосувань алгоритму Крускала є кластеризація в одному ланцюзі .

Розгляньте n вершин і ви маєте повний графік. Отримайте ak кластери цих n точок. Алгоритм запуску Крускала над першими n- (k-1) ребрами відсортованого набору ребер. Ви отримаєте k-кластер графіка з максимумом інтервал.


3

Найкращий час для Крускала - O (E logV). Для Prim, використовуючи фіброві купи, ми можемо отримати O (E + V lgV). Тому на щільному графіку у Прима набагато краще.


2

Prim's краще для більш щільних графіків, і в цьому нам також не потрібно приділяти багато уваги циклам, додаючи ребро, оскільки ми в першу чергу маємо справу з вузлами. Прайм швидше, ніж Крускал у випадку складних графіків.


2

У алгоритмі kruskal у нас є кількість ребер і кількість вершин на даному графіку, але на кожному ребрі у нас є деяке значення або вага, від імені якого ми можемо підготувати новий графік, який не повинен бути циклічним або не закриватися з будь-якої сторони. Наприклад

такий графік _____________ | | | | | | | __________ | | Назвіть назву будь-якої вершини a, b, c, d, e, f.

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