Phlp Blle (unon-fnd). Vedlgehold en dynamsk famle af mængder under operatoner: INIT(n): opret mængder {}, {},, {n} UNION(,): forener de to mængder der ndeholder og. Hvs og er samme mængde skal der ngentng ske. FIND(): returnerer en repræsentant for mængden der ndeholder. INIT() {} {} {} {} {} {} {} {} {} UNION(,) {,, } {,,, } {, } {,,,, } {,,, } Repræsentant kan være et hvlket som helst element mængden. FIND() == FIND() hvs og kun hvs og er samme mængde. Anvendelser. Mndste udspændende træ. Unfcerng logk og oversættere (afgør om udtryk er ens). Nærmeste fælles forfader træer. Hoshen-Kopelman Algortme fysk Spl (Hex og Go) Illustraton af snedge teknkker tl desgn af datastrukturer.
Hurtg fnd d[]. Vedlgehold en tabel d[..n] så d[] er repræsentant for. INIT(n): sæt alle elementer tl at være deres egen repræsentant UNION(,): opdater repræsentant for alle elementer den ene mængde. FIND(): returner repræsentant. d[] UNION(,) {,, } {,,, } {, } {,,,, } {,,, } INIT() {} {} {} {} {} {} {} {} {} Hurtg fnd Hurtg fnd INIT(n): for k = to n d[k] = k FIND(): return r[] UNION(,): ID = FIND() ID = FIND() f (ID ID) for k = to n f (d[k] == ID) d[k] = ID Theorem. V kan løse forén og fnd med n elementer O(n) td for INIT O() td for FIND O(n) td for UNION d[] UNION(,) {,, } {,,, } {, } {,,,, } {,,, }
Hurtg forenng. Vedlgehold hver mængde som et rodfæstet træ repræsenteret ved tabel p[..n] af forældrepegere. Roden af træ er repræsentant for mængde og p[rod] = rod. INIT(n): lav n træer med et element hver. UNION(,): hvs FIND() FIND(), gør rod af det ene træ tl barn af roden af det andet træ. FIND(): følg st tl rod og returner den. UNION(,) p[] Hurtg forenng Hurtg forenng INIT(n): lav n træer med et element hver. UNION(,): hvs FIND() FIND(), gør rod af det ene træ tl barn af roden af det andet træ. FIND(): følg st tl rod og returner den. Opgave. Vs datastruktur efter hver operaton følgende sekvens. INIT(), UNION(,), UNION(,), UNION(,), UNION(,), UNION(,), UNION(,), UNION(,), UNION(,). INIT(n): for k = to n p[k] = k FIND(): whle ( = p[]) = p[] return UNION(,) UNION(,): r = FIND() r = FIND() f (r r ) p[r ] = r
Hurtg forenng Theorem. V kan løse forén og fnd med n elementer O(n) td for INIT O(d) td for FIND O(d) td for UNION Dybden d af T er den maksmale længde af en st fra rod tl blad. Dårlg nyhed. Dybden kan være n-. Udfordrng. Kan v sætte sammen træerne snedgt sammen så v begrænser dybden? d = d = n- Vægtet forenng Vægtet forenng. Udvdelse af hurtg forenng. Vedlgehold tabel sz[..n] med størrelse af hver knude = antallet af knuder deltræ. INIT: (næsten) som før. FIND: som før. UNION(,): hvs FIND() FIND(), gør rod af det mndste træ tl barn af roden af det største træ. Intuton. Vægtet forenng balancerer træerne. r r UNION(,) r r UNION(,): r = FIND() r = FIND() f (r r ) f (sz[r ] < sz[r ]) p[r ] = r sz[r ] = sz[r ] + sz[r ] else p[r ] = r sz[r ] = sz[r ] + sz[r ] r r UNION(,) r r sz[r] = sz[r] + sz[r]
Vægtet forenng Lemma. Med vægtet forenng er dybden af en knude høst log n. Bevs. Kg på en knude med dybde d. Intelt er d = 0. d øges med når træet med forenes med et større træ. Det forenede træ er mndst dobbelt så stort. V kan fordoble størrelse af træer høst log n gange. d log n. Vægtet forenng Theorem. V kan løse forén og fnd med n elementer O(n) td for INIT O(log n) td for FIND O(log n) td for UNION Datastruktur hurtg fnd hurtg forenng vægtet forenng UNION O(n) O(n) O(log n) FIND O() O(n) O(log n) Udfordrng. Kan v gøre det endnu bedre? Hvad er den bedste man kan håbe på?
Stkompresson. Komprmer sten ved FIND = alle knuder på st blver barn af rod. Ændrer kke på td for en FIND operaton. Efterfølgende FIND operatoner blver hurtgere. Vrker både med hurtg forenng og vægtet forenng. Stkompresson Theorem [Taran ]. Med stkompresson tager enhver sekvens af m FIND og UNION operatoner over n elementer O(n + m α(m,n)) td. α(m,n) er den nverse tl Ackermanns funkton. α(m,n) for ethvert praktsk nput. Theorem [Fredman-Saks ]. Det er kke mulgt at understøtte m FIND og UNION operatoner O(n + m) td. FIND() FIND() 0 0 0 0 Datastruktur hurtg fnd hurtg forenng m UNION og FIND O(mn) O(mn) vægtet forenng O(n + mlog n) vægtet forenng + stkompresson O(n + m α(m,n)) umulgt O(n + m)
Dynamske sammenhængskomponenter. Vedlgehold en dynamsk graf under operatoner. INIT(n): opret en graf G med n knuder og ngen kanter. CONNECTED(u,v): afgør om u og v er sammenhængende. INSERT(u, v): tlfø kant (u,v). V antager (u,v) kke allerede fndes. Dynamske sammenhængskomponenter Implementaton med forén og fnd. INIT(n): ntalser en forén og fnd datastruktur med n elementer. CONNECTED(u,v): FIND(u) == FIND(v). INSERT(u, v): UNION(u,v) INSERT(,) INSERT(,) Dynamske sammenhængskomponenter Theorem. V kan løse dynamske sammenhængskomponenter en graf med n knuder O(n) td for INIT O(log n) td for CONNECTED O(log n) td for INSERT