140 likes | 287 Views
INF 295 forelesning 14 - kap 8 Disjunkt mengde ADT. Hans Fr. Nordhaug (Ola Bø). Disjunkt mengde ADT. Mange anvendelser i grafteori Enkelt å implementere raske løsninger Forståelse krever at man kjenner til det matematiske begrepet ekvivalensrelasjon. Ekvivalensrelasjoner.
E N D
INF 295 forelesning 14 - kap 8Disjunkt mengde ADT Hans Fr. Nordhaug (Ola Bø)
Disjunkt mengde ADT • Mange anvendelser i grafteori • Enkelt å implementere raske løsninger • Forståelse krever at man kjenner til det matematiske begrepet ekvivalensrelasjon
Ekvivalensrelasjoner • En ekvivalensrelasjon er en sammenheng R mellom elementer i en mengde S som er: • refleksiv: a R a for alle a i S • symmetrisk: Hvis a R b, så b R a • transitiv: Hvis a R b og b R c, så er a R c • Eksempel på relasjoner: • a R b betyr at du kan kjøre fra a til b med bil • a R b betyr at a og b bor i samme land • a R b betyr at a er koplet til samme nett som b • a R b betyr at a og b gir samme rest ved divisjon med 7
Ekvivalensrelasjoner • Disjunkte mengder og ekvivalensrelasjoner • En ekvivalensrelasjon deler S i disjunkte (ikke overlappende) delmengder {{Oslo, Bergen, Stavanger},{Longyearbyen},{Keflavik, Reykjavik}} • Ekvivalensklassen til et element a er alle elementer x slik at a R x • For å sjekke om x R a er det nok å sjekke at de er i samme ekvivalensklasse
Ekvivalensrelasjoner kan være dynamiske • Normalt får vi oppgitt S = {{a1},{ a2},{ a3},{ a4}} • I utgangspunktet er ingen elementer relatert til hverandre. Bare ett element i hver ekvivalensklasse • Vi får oppgitt par av elementer som er relatert til hverandre: a1 R a3 og a4 R a3 er nok til å si at {a1, a3, a4} er en ekvivalensklasse. (Hvorfor?) • En datatype for å håndtere denne dynamikken greier seg med to operasjoner: • finn(a) som returnerer navnet på ekvivalensklassen der a deltar. a R b hvis finn(a)==finn(b) • union(a,b) som slår sammen ekvivalensklassen til a med ekvivalensklassen til b
Mulige implementeringer • Kjøretidsberegninger ser på totalt tidsforbruk i strukturens levetid – maksimalt N-1 union-operasjoner • boolean ekvivalent[N][N] • finn blir O(1), union O(N) per operasjon totalt O(N2) • Lenket liste • Raskere Union fordi full gjennomsøking ikke er nødvendig, men fortsatt O(N2) • array som for hvert element inneholder navnet på ekvivalensklassen • finn blir O(1), union blir O(N) og union totalt O(N2), men akseptabelt ved N2 find • tilsvarende, men med kjent medlemstall og alltid navneskifte på minste ekvivalensklasse gir union totalt O(Nlog N)
Grunnleggende datastruktur - Tre • Nok at find returnerer samme resultat for to elementer i samme ekvivalensklasse • Alle elementer i samme tre har samme rot - så da kan ekvivalensklassen representeres av et tre. • Ekvivalensklassen får navn etter rota • Det eneste en node trenger er en peker til foreldrenoden • finn() følger foreldrepekerne til rota og returnerer den • union(a,b) lar a være rota med nytt barn b. (b peker på a) • Kan implementeres i en array, der: • Hvert element har peker til foreldrenoden. • Rota har negativ peker. Alle elementer er røtter i starten - vi starter med en skog
Mer om treimplementering av disjunkte set • union(a,b) går i konstant tid • find(x) avhenger av dybden til x • O(N) worst case • O(MN) for M find/union operasjoner • Gjennomsnittskjøretider er vanskelige: • Avhenger av hva du mener med gjennomsnitt • O(M), O(MlogN) eller O(MN) • Kvadratisk kjøretid er uakseptabelt
Smarte Union-algoritmer • Union på størrelse • Det minste treet barn av det største treet • Rota har -nodeantall som pekerverdi • O(M) for M operasjoner • Union på høyde • Det laveste treet barn av det høyeste treet • Rota har -høyde-1 som pekerverdi
Sti-komprimering • Worst case find kan bli dårlig for union by size/height • Stikomprimering løser problemet • Ved find endres alle noder som gjennomløpes slik at de peker på rota • Effekten er at find blir raskere ved senere aksess til disse nodene • Gjøres ved forelder=forelder.find() • Stikomprimering og union by height • Ikke kompatibelt ettersom stikomprimering kan endre høyden og endringsberegning for kostbar • Løsning: Like effektivt: Høyde korrigeres ikke for komprimering. Kalles da RANK. • Stikomprimering+union by rank gir worst case nesten O(M) der m er antall union eller findoperasjoner