Хопкрофт-Карп алгоритам

У рачунарству, Хопцрофт-Карп алгоритам је алгоритам који као улаз има бипартитни граф, а као излаз даје упаривање са максималним бројем грана, највећи скуп грана које немају заједничке крајње тачке. Временска сложеност алгоритма је у најгорем случају, где је скуп грана, а скуп чворова графа. У случају густих графова сложеност постаје кључна , а за случајне графове је линеарна. Алгоритам су развили Јохн Хопцрофт и Рицхард Карп (1973 године). Као и претходни алгоритми који се односе на упаривање као сто су Мађарски алгоритам и рад Едмондс-а (1965), Хопцрофт-Карп алгоритам стално повећава величину делимичног упаривања проналажењем алтернирајућих путева. Међутим, уместо да проналази само један алтернирајући пут по итерацији, алгоритам проналази максимални скуп најкраћих алтернирајућих путева. Као резултат тога само итерација је потребно. Исти принцип је коришћен при развијању сложенијих алгоритама за не-бипартитно упаривање са истом асимптотском сложеношћу као и Хопцрофт-Карп алгоритам.

Алтернирајући путеви уреди

Теме које не припада грани која се налази у скупу делимично упарених грана  , се зове слободно(неупарено) теме. Основни концепт на ком се алгоритам заснива је везан за алтернирајуће путеве, путеве који почињу и завршавају се неупареним чвором, а наизменично пролазе кроз гране које су ушле у скуп упарених и кроз оне које нису. Број грана на том путу мора бити непаран, јер поциње и завршава се неупареним чвором. Нека је   скуп чворова са њиховим гранама, а   скуп упарених чворова са њиховим гранама . Алтернирајући пут   за дато упаривање   је пут између два неупарена чвора, при чему су гране пута   наизменично у  , односно  . Број грана које припадају скупу   има за један више него оних које припадају скупу   . Према томе, ако из упаривања избацимо све гране које припадају скупу  , а убацимо све оне које припадају скупу  , добићемо упаривање са једном граном више. Јасно је да ако за дато упаривање постоји алтернирајући пут, онда оно није оптимално. Испоставља се да је и обрнуто тврђење тачно. Упаривање је оптимално ако и само ако нема алтернирајући пут.

Алтернирајући пут у проблему упаривања је блиско повезан са алтернирајућим путевима у проблему максималног протока. Могуће је трансформисати проблем бипартитног упаривања у пример проблема максималног протока, тако сто алтернирајући путеви у проблему упаривања постану алтернирајући путеви у проблему протока[1]. У ствари, генерализација технике која се користи у Хопцрофт-Карп алгоритму је позната као Диниц алгоритам.

Инпут: Бипартите грапх  
Оутпут: Матцхинг  
 
репеат
  максималан скуп чворова који не припадају најкраћим алтернирајућим путевима
 
унтил  

Алгоритам уреди

Нека   и   буду два скупа у бипартитном графу  , и нека се упаривање из   у   у било које време може представити као скуп  . Алгоритам се ради у фазама. Свака фаза се састоји од следећих корака.

  • БФС претрага дели партиције чворова графа на слојеве. Слободни чворови из   се користе као полазна темена за претрагу, и формира се први слој партиције. Током првог нивоа претраге можемо проћи само кроз неупарене ивице (пошто слободни чворови из У по дефиницији не припадају упареним гранама), у наредним нивоима претраге, пролазићемо наизменично кроз упарене и неупарене гране. Приликом тражења суседних чворова почев од чворова из   , можемо проћи једино кроз неупарене гране, док из чворова који припадају   можемо проћи само кроз упарене гране. Претрага се завршава на првом слоју   где су пронађени један или више слободних чворова из  .
  • Сви слободни чворови из   на слоју   се налазе у скупу  . Цвор   се налази у   ако и само ако је крај најкраћег алтернирајућег пута.
  • Алгоритам проналази максималан скуп чворова који не припадају алтернирајућим путевима дужине  . Овај скуп може бити направљен ДФС претрагом из   до слободних чворова из  , коришћењем БФС слојева као водич, ДФС претрагом можемо проћи кроз гране које воде до непосећених чворова на претходном слоју, а ДФС стабло садржи наизменично упарене и неупарене гране. Чим је пронађен алтернирајући пут који садржи један од чворова из  , ДФС претрага се наставља из следећег почетног чвора.
  • Сваки од путева који је пронађен на овај начин се користи за увећање  .

Алгоритам се завршава када БФС претрагом није пронађен ни један алтернирајући пут.

Анализа уреди

Свака фаза се састоји од једне БФС претраге и једне ДФС претраге. Дакле, временска сложеност једне фазе је линеарна. Сложеност првих   фаза у графу са   чворова и   грана је   . Може се показати да свака фаза повећава дужину најкраћег алтернирајућег пута за најмање један, фаза проналази максималан скуп алтернирајућих путева задате дужине, тако да остали алтернирајући путеви морају бити дужи. Зато, када се почетних   фаза алгоритма заврши, преостали најкраћи алтернирајући пут има најмање   грана .Међутим, симетрична разлика евентуално оптималног упаривања и делимичног упаривања   током првих фаза формира колекцију чворова и грана које су дисјунктне алтернирајућим путевима и наизменичним циклусима. Уколико је сваки пут у колекцији бар дужине   , може бити највисе   путева у колекцији, и велицина оптималног упаривања се може разликовати од велицине   за највисе   грана. Пошто свака фаза алгоритма повећава величину упаривања за барем један, може постојати највише   додатних фаза пре него што се алгоритам заврши. Пошто алгоритам има највише   фаза, његова сложеност је у најгорем случају   . У многим случајевима,алгоритам има бољу временску сложеност. На пример, у просечном случају, за случајне оскудне бипартитне графове, Баст ет ал. Је показао да са великом вероватноћом сва неоптимална упаривања имају алтернирајуће путеве логаритамске дужине. Као последица, за ове графове, Хопцрофт-Карп алгоритам има   фаза, а укупна сложеност је   .

Не-бипартитни графови уреди

Иста идеја о проналажењу максималног скупа најкраћих алтернирајућих путева се користи и за проналажење максималног упаривања у не-бипартитним графовима, и из истих разлога, алгоритам базиран на овој идеји има   фаза. Међутим, за не-бипартитне графове је теже пронаћи алтернирајуће путеве у свакој фази. Надовезујући се на рад неколико споријих претходника, Мицали и Вазирани (1980) су показали како се може имплементирати појединачна фаза са линеарном сложеношћу, што је резултовало алгоритмом који има исту временску сложеност као Хопцрофт-Карп алгоритам за бипартитне графове. Мицали-Вазирани техника је комплексна и њени аутори немају комплетан доказ, алтернативне методе за овај проблем су касније описали други аутори.[2]

Псеудокод уреди

 
 1 //G = G1 ∪ G2 ∪ {NIL}
 2 //G1 i G2 su particije grafa a NIL specijalni null čvor
 3 
 4 
 5    function BFS ()
 6    for v in G1
 7        if Pair_G1[v] == NIL
 8            Dist[v] = 0
 9           Enqueue(Q,v)
 10       else
 11           Dist[v] = 
 12    Dist[NIL] = 
 13    while Empty(Q) == false
 14        v = Dequeue(Q)
 15        if Dist[v] < Dist[NIL] 
 16            for each u in Adj[v]
 17                if Dist[ Pair_G2[u] ] == 
 18                    Dist[ Pair_G2[u] ] = Dist[v] + 1
 19                    Enqueue(Q,Pair_G2[u])
 20    return Dist[NIL] != 

 1    function DFS (v)
 2    if v != NIL
 3        for each u in Adj[v]
 4            if Dist[ Pair_G2[u] ] == Dist[v] + 1
 5                if DFS(Pair_G2[u]) == true
 6                    Pair_G2[u] = v
 7                    Pair_G1[v] = u
 8                    return true
 9        Dist[v] = 
 10           return false
 11   return true

 1    function Hopcroft-Karp
 2        for each v in G
 3            Pair_G1[v] = NIL
 4            Pair_G2[v] = NIL
 5        matching = 0
 6        while BFS() == true
 7            for each v in G1
 8                if Pair_G1[v] == NIL
 9                    if DFS(v) == true
 10                       matching = matching + 1
 11    return matching

Референце уреди

  1. ^ Ахуја, Магнанти & Орлин 1993, секција 12.3, проблем бипартитног упаривања, стр. 469–470.
  2. ^ Габоw & Тарјан 1989 и Блум 2001.