Diszkrét matematikai algoritmusok

A diszjunktum-beállított adatszűkület rendszer nem metszésmentes nem-készletkészletekből áll, amelyek mindegyikében az egyik elem (reprezentatív) fix. Pontosabban, a készletek elemei a memóriában lévő tárgyak, és a velük való munkát mutatók segítségével végzik el. A következő műveleteket támogatni kell:







  • Make-Set (x). Az eljárás egy mutatót mutat a (már létező) x objektumhoz. Új készletet hoz létre, az egyetlen elem (és így a reprezentatív) az x pointer által meghatározott. Mivel a készletek nem metszenek egymással, akkor x egy új objektumra mutat (amely nem létezik a meglévő készletekben).
  • Find-Set (x) ("megtalálja a készletet"). Visszaad egy mutatót egy (egy) készlet egy olyan képviselőjének, amely az x által mutatott elemet tartalmazza.
  • Unió (x. Y) ("unió"). Alkalmazható, ha az x és y elemek különböző Sx és Sy készletekben vannak. és ezeket a készleteket az Sx ∪ Sy egység helyettesítette; ebben az esetben egy Sx ∪ Sy képviselõt választunk. Az Sx és Sy készletek törlődnek.

Mindenesetre elengedhetetlen, hogy a készlet képviselője ne változzon meg, miközben maga a készlet változatlan marad (nem egyesítik a másikat). A "diszjunkt készletek rendszere" kisalkalmazás bemutatja a két leginkább alkalmazható implementációhoz használt diszjunkt szekvenciák működését, a listák felhasználásával és a diszjunktáblák erdőjével.

Végrehajtás listákkal

A diszjunktúra-rendszer végrehajtásának legegyszerűbb verziója minden egyes készlet listát tárol. Ebben az esetben a lista első eleme a készlet reprezentatívnak tekintendő, és a lista minden eleme hivatkozásokat tartalmaz a lista következő elemére és a lista első elemére. Minden lista esetében a mutatókat az első és az utolsó elemre tároljuk (a második szükséges, ha elemeket adunk a lista végére). A listában szereplő elemek sorrendje lehet. Ezzel a megvalósítással a Make-Set és Find-Set műveletek O (1) időt igényelnek: Make-Set létrehoz egy listát egy elemből, és a Find-Set visszaad egy mutatót a lista elejére.

Az egyesület legegyszerűbb végrehajtása

Természetes végrehajtással az Unió működése drága. Előadói egység (x .Y). hozzáadunk egy x-et tartalmazó listát. a y tartalmú lista végére. Ebben az esetben még mindig meg kell adnia a helyes mutatókat a lista elejére az x elemet tartalmazó összes korábbi elemhez. és a művelet végrehajtásához szükséges idő lineárisan függ a készlet méretétől.

Könnyű megadni egy példát, amelyben a végrehajtási idő kvadratikusan függ a műveletek számától. Legyen n elem x 1 x 2. xn adható. Végezze el a Make-Set műveleteket (xi) minden i = 1, 2, ..., n esetén. majd az n - 1 műveletek Union (x 1. x 2). Unió (x 2 x 3). ..., Union (x n-1. Xn). Mivel az Unió (xi X i + 1) művelet költsége arányos i. a 2 n - 1 művelet elvégzésének teljes költsége arányos lesz n + (n -1) + ... + 1 = θ (n 2) értékkel.

Súlyheurisztika

Az uniós művelet legegyszerűbb megvalósítása lassan működik, mivel amikor egy hosszú listát egy rövidhez ad hozzá, akkor új értékeket kell hozzárendelnie egy nagyszámú mutatóhoz. A dolgok jobban megyek, ha ezt megteszi: tárolja az elemek számát minden listában, és rövidebb listát ad a hosszabbik végéhez (ha a hosszúságok egyenlők, a sorrend bármely lehet). Ezt a technikát súlyozott union-heurisztikusnak nevezik. Ha a kombinált készletek körülbelül egyenlő elemeket tartalmaznak, akkor nem lesz nagy nyereség, de összességében, amint azt a következő tétel mutatja, megtakarítást érünk el.







Tétel 1. Tegyük fel, hogy a diszjunktáramkörök rendszere listák felhasználásával valósul meg, és működés közben uniós súlyú heurisztikát használnak. Ezután a m Make-Set műveletek sorrendje. Unió és Find-Set. amelyek között n műveletek Make-Set. O (m + n log) (feltételezzük, hogy kezdetben a diszjunktus-készletek rendszere üres volt).
Ennek a tételnek a bizonyítéka a Kormen 419. könyvében található.

Erdõkészletek erdeje

A diszjunktúra-rendszer esetében hatékonyabb megvalósítás létezik (összehasonlítva a vizsgáltakkal). Nevezetesen, minden csoportot egy gyökérfával ábrázolunk, amelyben a csúcsok a készlet elemei, és a gyökér a reprezentatív. Kiderült, hogy erdős, erdős erdők erdeje. Amint láthatod, minden csúcspont a szülőjére mutat, és a gyökér a saját maga felé mutat. A Find-Set és az uniós műveletek naiv programozásával egy ilyen megvalósítás nem lesz jobb, mint egy lista-végrehajtás; Ha azonban az "unió szerinti rangsorolás" és "ösvénykompresszió" heurisztikáját alkalmazza, akkor a diszjunktípusok rendszerének leggyorsabb (a jelenleg ismert) megvalósításával kapjuk meg.

Naiv műveletek végrehajtása során a következők: Make-Set létrehoz egy fa egy vertex, Find-Set (x), hogy megyünk x a nyilak (mutat a szülő), amíg eljutunk a gyökér (az utat, hogy mi vagyunk ugyanabban az időben megkeressük a keresési útvonalat angolul, keressük az utat), és az Unió az, hogy az egyik fának gyökerét arra kényszerítjük, hogy ne mutasson magára, hanem egy másik fa gyökerére.

Két heurisztika

Eddig nincsenek nagy előnyök (összehasonlítva a listák végrehajtásával): például az n-1 műveletek eredményeként az Unió egy olyan fát kaphat, amely n vertikumok lánca. Két heurisztikát írunk le, amelyek lehetővé teszik az idő közel lineáris becslését.

Az első heurisztikus nevezett unió rang (unió a rangsorban), emlékeztet a tömeg heurisztika bér végrehajtás: kombináljuk a fák nem olyan szörnyű is, hogy a gyökere a „kisebb” a fa mutat a gyökere a „nagyobb”. A "nagyobb" választást nem a fa méretének, hanem a speciális paraméternek - a gyökér rangjának határozza meg. Grade definiáljuk minden egyes x csúcs a fa és első közelítésben lehet tekinteni, mint egy durva becslés a logaritmusa csomópontok száma a részfában gyökerű x. A rang pontos meghatározását az alábbiakban adjuk meg.

A Find-Set műveletben használt második heurisztika. az úttörésnek nevezik. A következőkből áll: a csúcsról a gyökérbe vezető keresési útvonal megkerülése után a fa újjáépítésre kerül: az út minden csúcsán a mutató közvetlenül a gyökérbe van állítva. Ugyanakkor a rangsorok ugyanazok maradnak.

A következő Make-Set műveletprogramok. A Find-Set és az Union magában foglalja a rang induktív definícióját, de a kényelem érdekében verbálisan átmásoljuk. Amikor létrehoz egy készletet a Make-Set használatával, a fa egyetlen csúcsa 0-as pozícióba kerül. A Find-Set művelet (útvonal tömörítéssel) nem változtatja meg a sorokat. Amikor egy uniós műveletet hajt végre olyan fákkal, amelyeknek gyökérhomlokzatai különbözőek, egy új nyíl a kisebb rang gyökerétől a felsőbb rang gyökeréig tart, és a rangok ismét nem változnak. Ha végül uniós műveletet elvégezni a fák, a gyökerek a soraiban egyenlő, akkor az egyik gyökere (még egy) készít egy nyíl a másikra, és azonos értékű egyesített gyökér a fa eggyel növekszik (a másik soraiban nem változik). Látható, hogy az így definiált csúcs rangja felső határ a felső rész magasságához, amelynek gyökere ezen a csúcson van.

A p [x] alatt az x csúcs szülője. rang [x] rangja; a Link eljárás paraméterei. amelyet az uniós eljárásból hívnak. két fának gyökerei (pontosabban, mutatók).

A rekurzív Find-set eljárás két lépésben működik: először a fa gyökere felé megy, majd fordított sorrendben, a forduló nyilakkal az előforduló csúcsokból a fa gyökeréhez. Ha az x nem gyökér, akkor a Find-beállítja a hívásokat, de az x szülő paraméterrel. Ezután az x szülőjének x szülője az új Find-set hívással (2. sor) található fa gyökere. Ha x egy gyökér, akkor a 2. sor nem fut, és az x-re mutató rögtön visszatér.

Mi a heurisztika?

Még akkor is, ha külön-külön alkalmazzuk, az egyesülés fokozatosan és az ösvények tömörítésével időben nyereséget nyer. Ha alkalmazza a szakszervezeti rang tömörítés nélkül utak, a becsült működési idő lesz nagyjából ugyanaz, mint amikor egy szereplő végrehajtási súlya heurisztikus, azaz O (m log n) (m - ügyletek számát, n - a műveletek száma Make-Set). Ez a becslés nem javítható. Ha az útvonal tömörítését rangsorolás nélküli összeadás nélkül alkalmazza, akkor a munkafolyamat végrehajtási ideje, beleértve a Make-Set műveleteket és a Find-Set műveleteket. van (a legrosszabb esetben) θ (f · log1 + f / n n) az f ≥ n és θ (n + f · log n) számára f

Még nagyobb megtakarítás érhető el mindkét heurisztika együttes alkalmazásával. Ugyanakkor a legrosszabb esetben a munkaidő O (m α (m. N)), ahol α a rendkívül lassan növekvő "visszafelé irányuló Ackerman-függvény". Az elképzelhető alkalmazásokban az α (m. N) ≤ 4 egyenlőtlenség teljesül, így a gyakorlatban feltételezhető, hogy a futási idő m-ben lineáris. A fenti állítások és részletesebb információk a diszjunkt szettek rendszeréről, üdvözöljük a Kormen könyvét :)

irodalom