ID1020: Union-Find. Dr. Jim Dowling jdowling@kth.se. kap. 1.5. Slides adapted from Algorithms 4 th Edition, Sedgewick.



Relevanta dokument
Ekvivalensrelationer

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 10. ADT:er och datastrukturer

Dugga Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 4 Datastrukturer (DAT037)

Sökning och sortering

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 10. Grafer, Dijkstra och Prim

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Lösningsförslag till tentamen Datastrukturer, DAT037,

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer (DAT036)

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 7. Träd och binära sökträd

Tentamen, Algoritmer och datastrukturer

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 2 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Trädstrukturer och grafer

Föreläsning 7. Träd och binära sökträd

Föreläsning 8 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Tentamen Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

ID1020: Quicksort. Dr. Jim Dowling kap 2.3. Slides adapted from Algoritms 4 th Edition, Sedgewick.

Länkade strukturer, parametriserade typer och undantag

Programmering för språkteknologer II, HT2011. Rum

Tentamen Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Tentamen Datastrukturer D DAT 035/INN960

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Föreläsning 6 Datastrukturer (DAT037)

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Föreläsning 2. Länkad lista och iterator

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning Datastrukturer (DAT036)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 3-4 Innehåll

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Den som bara har en hammare tror att alla problem är spikar

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Algoritmer. Två gränssnitt

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 11. ADT:er och datastrukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

ID1020 Algoritmer och Datastrukturer

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Seminarium 13 Innehåll

SMD 134 Objektorienterad programmering

Tentamen Datastrukturer (DAT036)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 10 Datastrukturer (DAT037)

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Föreläsning 11 Datastrukturer (DAT037)

Tentamen Grundläggande programmering

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Transkript:

ID1020: Union-Find Dr. Jim Dowling jdowling@kth.se kap. 1.5 Slides adapted from Algorithms 4 th Edition, Sedgewick.

Att utvecka en algoritm Stegen för att utveckla en användbar algoritm: - Bygg en modell av problemet. - Hitta en algoritm för att lösa problemet. - Är algoritmen snabb nog? Passar den i minnet? - Om inte, kom på varför. - Hitta ett sätt att fixa problemet. - Iterera tills man är njöd. Sedan, ska man analysera algoritm. 2

Dynamisk-konnektivitet problem Givet en mängd av N objekt, programmet ska stödja två operationer: - Union: skapa en förbindelse mellan (connect) två objekt. - Find: Finns det en stig (path) som förbinder två objekt? connect 4 and 3 connect 3 and 8 connect 6 and 5 0 1 2 3 4 connect 9 and 4 connect 2 and 1 are 0 and 7 connected? are 8 and 9 connected? connect 5 and 0 connect 7 and 2 connect 6 and 1 connect 1 and 0 are 0 and 7 connected? x 5 6 7 8 9 3

Ett större konnektivitetsproblem Finns det en stig som förbinder p till q? Ja! p q 4

Bygg en modell av objekten Applikationer manipulerar objekt av alla möjliga typer. - Pixlar i en digitalbild. - Dator i ett nätverk. - Kompisar i ett socialt nätverk. - Transistorer i ett datorchip. - Element i en matematisk mängd. - Variabelnamn i ett Fortran program. När man programmerar, underlättar det att benämna objekt 0 till N 1. - Använd ett heltal som en array index. - Ta bort alla detaljer som inte är relevant till union-find. 5

Bygg en modell av förbindelserna Vi antar "är förbunden till" (connected to) är en ekvivalensrelation: - Reflexiv: p är förbunden till p. - Symmetrisk: om p är förbunden till q, q är förbunden till p. - Transitiv: om p är förbunden till q och q är förbunden till r, p är förbunden till r. En ekvivalensrelation partitionerar objekt i ekvivalensklasser som kallas för connected components. Sammanhängande komponent (connected component). Största mängd av objekt som har ömsesidiga förbindelser. 0 1 2 3 4 5 6 7 { 0 } { 1 4 5 } { 2 3 6 7 } 3 (sammanhängande) komponenter 6

Att implementera Find och Union operationer Find. I vilken komponent hittar vi objekt p? Connected. Finns objekt p och q i samma komponent? Union. Ersätt komponenterna som innehåller objekt p och q med en ny komponent som inkluderar både deras komponenterna, dvs deras union". 0 1 2 3 union(2, 5) 0 1 2 3 4 5 6 7 4 5 6 7 { 0 } { 1 4 5 } { 2 3 6 7 } { 0 } { 1 2 3 4 5 6 7 } 3 komponenter 2 komponenter 7

Union-find datatyp (API) Mål. Bygg en effektiv datastruktur för union-find. - Antal objekt N kan vara enorm. - Antal operationer M kan också vara enorm. - Klienter kan anropa union och find operationer i vilken ordning som helst. public class UF UF(int N) void union(int p, int q) initialize union-find data structure with N singleton objects (0 to N 1) add connection between p and q int find(int p) component identifier for p (0 to N 1) boolean connected(int p, int q) are p and q in the same component? 8

connected() connected() kan implementeras med bara en kodrad: public boolean connected(int p, int q) { } return find(p) == find(q);

Ett exempel Klient till UF API:et Läs in ett antal objekt N från stdin (standard input). Upprepa stegen nedan: 1. läs in ett par heltal från stdin 2. om de inte är förbundna ännu, skapa en förbindelse mellan dem och skriv ut paret public static void main(string[] args) { int N = StdIn.readInt(); UF uf = new UF(N); while (!StdIn.isEmpty()) { } int p = StdIn.readInt(); int q = StdIn.readInt(); if (!uf.connected(p, q)) { } uf.union(p, q); StdOut.println(p + " " + q); % more tinyuf.txt 10 4 3 3 8 6 5 9 4 2 1 8 9 5 0 7 2 6 1 1 0 6 7 antal object N redan förbundna } 1

Quick-find

Quick-find [ivrig metod] Datastruktur. - Integer array id[] av längd N. - Förklaring: id[p] är id:n av komponenten som innehåller p. p och q är förbundna iff (om och endast om) de har samma id. id[] 0 1 0 1 2 3 1 8 4 5 8 0 6 7 0 1 8 9 8 8 0, 5 och 6 är förbundna 1, 2, och 7 är förbundna 3, 4, 8, och 9 är förbundna 0 1 2 3 4 5 6 7 8 9 1

Quick-find Datastruktur. - Integer array id[] av längd N. - Förklaring: id[p] är id:n av komponenten som innehåller p. 0 1 2 3 4 5 6 7 8 9 id[] 0 1 1 8 8 0 0 1 8 8 Find. Vad är id av p? Förbundna? Har p och q samma id? id[6] = 0; id[1] = 1 6 och 1 är inte förbundna Union. För att förbinda komponenter som innehåller p och q, ändra alla element vars id = id[p] till id[q]. 0 1 2 3 4 5 6 7 8 9 id[] 1 1 1 8 8 1 1 1 8 8 efter ha slagit hop 6 och 1 problem: många värden kan förändras 1

Quick-find demo 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 id[] 0 1 2 3 4 5 6 7 8 9 1

Quick-find demo 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 id[] 1 1 1 8 8 1 1 1 8 8

Quick-find: Java implementation public class QuickFindUF { private int[] id; public QuickFindUF(int N) { id = new int[n]; for (int i = 0; i < N; i++) { id[i] = i; } } ge varje objekt samma komponent-id som dess egen id (N array accesser) } public boolean find(int p) { return id[p]; } public void union(int p, int q) { int pid = id[p]; int qid = id[q]; for (int i = 0; i < id.length; i++) { if (id[i] == pid) id[i] = qid; } } returnera id av p (1 array access) ändra alla element med id[p] till id[q] (tar som mest 2N + 2 array accesser) 1

Quick-find är för långsam Kostnadsmodell. Antal array accesser (array läsningar och skrivningar). algoritm initialize union find connected quick-find N N 1 1 beräkningstiden för array accesser kvadratisk Union är för dyrt. Det tar N 2 array accesser för att bearbeta en sekvens av N union operationer på N objekt. 1

Kvadratisk algoritmer skalar inte Tumregeln (för nu). - 10 9 operationer per sekund. - 10 9 minnesord av huvudminne. förhållanden har hålt i sig sedan 1950! - Kan komma åt alla minnesord på ungefär 1 sekund. Stort problem för quick-find: - Med, 10 9 union operationer på 10 9 objekt, skulle quick-find exekverar mer än 10 18 operationer => 30+ år av beräkningstid! Kvadratisk algoritmer skalar inte med bättre teknologi. - Ny dator kan vara 10x snabbare. - Men, datorn har 10x mer minnet => måste lösa ett problem som är bara 10x större. - Med en kvadratisk algoritm, => 10x långsammare! 18

Quick Union

Quick-union [lat metod] Datastruktur. - Integer array id[] av längd N. - Förklaring: id[i] är förälder av i. - Roten (Root) av i är id[id[id[...id[i]...]]]. fortsätta tills den inte förändras (inga cyklar i algoritm) 0 1 9 6 7 8 0 1 2 3 4 5 6 7 8 9 2 4 5 id[] 0 1 9 4 9 6 6 7 8 9 3 föräldern av 3 är 4 roten av 3 är 9 20

Quick-union Datastruktur. - Integer array id[] av längd N. - Förklaring: id[i] är förälder av i. - Roten av i är id[id[id[...id[i]...]]]. 0 1 9 6 7 8 0 1 2 3 4 5 6 7 8 9 id[] 0 1 9 4 9 6 6 7 8 9 2 4 5 q p 3 Find. Vad är roten av p? Connected. Delar p och q samma rot? Union. För att förbinda komponenter som innehåller p och q, tilldelar id av p's rot till id av q's rot. id[] 0 1 0 1 2 3 9 4 4 5 9 6 6 7 6 7 8 9 8 6 roten av 3 är 9 roten av 5 är 6 3 och 5 är inte förbundna 0 1 2 9 4 6 7 8 5 q bara ett värde förändras p 3 21

Quick-union demo 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 id[] 0 1 2 3 4 5 6 7 8 9 22

Quick-union demo 8 1 3 9 0 2 7 4 5 0 1 2 3 4 5 6 7 8 9 6 id[] 1 8 1 8 3 0 5 1 8 8 23

Quick-union: Java implementation public class QuickUnionUF { private int[] id; public QuickUnionUF(int N) { id = new int[n]; for (int i = 0; i < N; i++){ id[i] = i; } } public int find(int i) { while (i!= id[i]) { i = id[i]; } return i; } public void union(int p, int q) { int i = find(p); int j = find(q); id[i] = j; } } ge varje objekt samma komponent-id som dess egen id (N array accesser) följ föräldrapekare tills man når roten (djupet av trädet array accesser) byt roten av p för att peka till roten av q (det tar djupet av p och q array accesser) 24

Quick-union är också för långsamt Kostnadsmodell. Antal array accesser. algoritm initialize union find connected quick-find N N 1 1 quick-union N N N N worst case inkluderar kostnaden av att hitta roten Quick-find defekt. - Union är för dyrt. (N array accesser). - Träden är flat", men det kostar för mycket att behålla dem flat. Quick-union defekt. - Träden kan bli för djupa. - Find/connected för dyrt (kan ta N array accesser). 26

Union Find förbättringar

Förbättring 1: Viktning Viktad quick-union. - Ändra på quick-union för att undvika djupa träd. - Spara storleken av trädet (dvs., antal objekt i trädet) i ett attribut. - Balansera träden genom att länka roten av det mindre trädet till roten av det större trädet. 28

Viktad quick-union demo 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 id[] 0 1 2 3 4 5 6 7 8 9 29

Viktad quick-union demo 6 4 0 2 5 3 8 9 1 7 0 1 2 3 4 5 6 7 8 9 id[] 6 2 6 4 6 6 6 2 4 4 30

Quick-union och viktad quick-union exempel 31

Viktad quick-union: Java implementation Datastruktur. Samma som quick-union, men vi behöver en extra array sz[i] för att räkna antal objekt i trädet med roten i. Find/connected. Samma som quick-union. Union. Ändringar till quick-union: - Länka roten av det mindre trädet till roten av det större trädet. - Uppdatera sz[] array. } int i = find(p); int j = find(q); if (i == j) return; if (sz[i] < sz[j]) { } else { id[i] = j; sz[j] += sz[i]; id[j] = i; sz[i] += sz[j]; 32

Viktad quick-union analys Körtiden. - Find: tar tid proportionellt mot djupet av p. - Union: tar konstant tid, givet rotnoderna. Sats. Djupet av nod x är maximalt lg N. lg = base-2 logarithm 0 1 1 1 djupet 3 2 x 2 2 2 3 3 N = 11 djupet(x) = 3 lg N 33

Viktad quick-union analys Körtiden. - Find: tar tid proportionellt mot djupet av p. - Union: tar konstant tid, givet rotnoderna. lg = base-2 logarithm Sats. Djupet av nod x är maximalt lg(n). Bevis. Vad är det som gör att djupet av objekt x ökar? - Ökar med 1 när trädet T1 som innehåller x sammanfogar (merges) med ett annat träd T2. - Storleken av trädet som innehåller x minst fördubblas eftersom T 2 T 1. - Storleken av trädet som innehåller x kan fördubblas som mest lg N gångar. Varför? 1 2 4 8 lg N T2 T1 x 16 N 34

Viktad quick-union analys Körtiden. - Find: tar tid proportionellt mot djupet av p. - Union: tar konstant tid, givet rotnoderna. Sats. Djupet av nod x är maximalt lg(n). algoritm initialize union find connected quick-find N N 1 1 quick-union N N N N viktad QU N lg N lg N lg N inkluderar kostnaden av att hitta roten Kommer algoritmen att terminera med garanterad acceptabelt prestanda? Nej, men det går lätt att förbättra den. 35

Förbättring 2: stig komprimering Quick union med stig komprimering (path compression). Precis efter ha beräknat roten av p, sätt id[] av varje examinerade nod så att den pekar till denna roten. 0 root 1 2 3 4 5 6 7 8 x 9 p 10 11 12 36

Förbättring 2: stig komprimering Quick union med stig komprimering. Precis efter ha beräknat roten av p, sätt id[] av varje examinerade nod så att den pekar till denna roten. 0 root p 9 1 2 11 12 3 4 5 x 6 7 8 10 37

Förbättring 2: stig komprimering Quick union med stig komprimering. Precis efter ha beräknat roten av p, sätt id[] av varje examinerade nod så att den pekar till denna roten. 0 root p 9 6 1 2 11 12 8 x 3 4 5 10 7 38

Förbättring 2: stig komprimering Quick union med stig komprimering. Precis efter ha beräknat roten av p, sätt id[] av varje examinerade nod så att den pekar till denna roten. 0 root p 9 6 3 1 2 x 11 12 8 7 4 5 10 39

Förbättring 2: stig komprimering Quick union med stig komprimering. Precis efter ha beräknat roten av p, sätt id[] av varje examinerade nod så att den pekar till denna roten. x 0 root p 9 6 3 1 2 11 12 8 7 4 5 10 Resultatet. Nu, find() har bi-effekten att den komprimerar trädet, dvs minska djupet av trädet. 40

Stig komprimering: Java implementation Tvåstegs implementation: lägg till en andra loop till find() för att tilldela id[] av varje examinerade nod till roten. Enklare ettstegs-variant (stighalvering): Gör att varannan nod i stigen pekar till sin farfar (grandparent). public int find(int i) { while (i!= id[i]) { id[i] = id[id[i]]; i = id[i]; } return i; } bara en extra rad av kod behövdes I praktiken. Det finns ingen anledning att inte komprimera stigen! Den behåller träden nästan flat. 41

Viktad quick-union with stig komprimering: amorterad analys Sats. [Hopcroft-Ulman, Tarjan] Om man börjar med en tom datastruktur, vilken sekvens som helst av M union-find operationer på N objekt gör mindre än c ( N + M lg* N ) array accesser. - Analys kan förbättras till N + M (M, N). - Enkel algoritm med fascinerande matematik. Linjärtid algoritm för M union-find operationer på N objekt? - Kostnad inom en konstant faktor av inläsningen av data. - I teori är WQUPC (weighted quick-union with path compression) inte helt linjär. - I praktiken är WQUPC linjär. N 1 0 2 1 4 2 16 3 65536 4 2 65536 5 lg* N itererade lg funktion Häpnadsväcknande fakta: Ingen linjärtid algoritm finns [Fredman-Saks]. i "cell-probe" beräkningsmodellen 42

Sammanfattning Slutsats. Viktad quick union (och/eller stig komprimering) möjliggör att lösa problem som annars inte hade kunnat lösas. algoritm quick-find quick-union viktad QU QU + stig komprimering viktad QU + stig komprimering worst-case time M N M N N + M log N N + M log N N + M lg* N beräkningstid för M union-find operationer på en mängd av N objekt Ex. [10 9 unions och finds med 10 9 objekt] - WQUPC minskar tiden från 30 år till 6 sekundar. - En Supercomputer hjälper inte mycket; det är en bra algoritm som möjliggör lösningen. 43

Union-Find applikationer

Union-find applikationer - Perkolation. - Spel (Go, Hex). Dynamisk konnektivitet. - Least common ancestor. - Ekvivalens av ändliga tillståndsautomater. - Hinley-Milner polymorphic type inference. - Kruskal's minsta uppspännande träd algoritm. - Matlab's bwlabel() funktion i bildbehandling. 45

Perkolation En abstrakt modell av många fysiska system: - N x N grid av platser (sites). - Varje plats är öppen med sannolikheten p (och blockerad med sannolikheten 1 p). - Systemet perkolerar iff topp och botten är förbundna genom öppna platser. 46

Perkolation En abstrakt modell av många fysiska system: - N x N grid av platser (sites). - Varje plats är öppen med sannolikheten p (och blockerad med sannolikheten 1 p). - Systemet perkolerar iff topp och botten är förbundna genom öppna platser. model system vacant site occupied site percolates electricity material conductor insulated conducts fluid flow material empty blocked porous social interaction population person empty communicates 47

Sannolikheten av perkolation Beror på grid storleken N och ledig plats (site vacancy) sannolikheten p. p low (0.4) does not percolate p medium (0.6) percolates? p high (0.8) percolates 48

Perkolation fasövergång När N är stor, teori garanterar en skarp tröskel p*. - p > p*: perkulerar med väldig hög sannolikhet. - p < p*: perkulerar med väldig låg sannolikhet. Vad är värdet av p*? 49

Monte Carlo simulering - Initialisera alla platser i en N-x-N grid så att deras tillstånd är blockerad (blocked). - Gör slump platser lediga tills det finns en stig mellan toppen och botten. - Ledighet procentsats (vacancy percentage) uppskatter p*. N = 20 helt ledig plats (förbunden till topp) ledig plats (inte förbunden till topp) blockerad plats 50

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Hur kan man kontrollera om ett N-x-N system perkolerar? Modellera som ett dynamisk konnektivitet problem och använd union-find. N = 5 ledig plats blockerad plats 51

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Hur kan man kontrollera om ett N-x-N system perkolerar? Skapa ett objekt för varje plats och tilldela de namn från 0 to N 2 1. N = 5 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ledig plats blockerad plats 52

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Hur kan man kontrollera om ett N-x-N system perkolerar? Skapa ett objekt för varje plats och tilldela de namn från 0 till N 2 1. Platser befinner sig i samma komponent iff de är förbundna med lediga platser. N = 5 ledig plats blockerad plats 53

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Hur kan man kontrollera om ett N-x-N system perkolerar? Skapa ett objekt för varje plats och tilldela de namn från 0 till N 2 1. Platser befinner sig i samma komponent iff de är förbundna med lediga platser. Perkolerar iff en av platsen på bottenraden (vilken som helst) är förbunden till en på toppraden (vilken plats som helst). brute-force algoritm: N 2 anrop till connected() N = 5 topprad bottenrad ledig plats blockerad plats 54

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Knep. Introducera 2 virtuella platser (virtual sites) med förbindelser till topp och botten. Systemet perkolerar iff den virtuella topp-platsen är förbunden till en virtuell bottenplats mer effektivt algoritm: bara 1 anrop till connected() virtuell topp-plats N = 5 topprad bottenrad ledig plats blockerad plats virtuell bottenplats 55

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Vi vill omvandla en blockerad plats till en öppen plats. Hur bygger man en model av detta? öpnna denna plats N = 5 ledig plats blockerad plats 57

Dynamisk konnektivitet lösning för att uppskatta perkolationströskeln Markera den nya platsen som ledig; förbinda alla sina angränsande lediga platser. upp till 4 anrop till union() öpnna denna plats N = 5 ledig plats blockerad plats 58

Perkolation tröskel Vad är perkolation tröskeln p*? Ungfär 0.592746 för large square lattices. konstant känd bara med hjälp av simuleringar En snabb algoritm möjliggör ett noggrannt svar till en vetenskaplig fråga. 59

Sammanfattning Union-Find är en intressant algoritm med många praktiska applikationer Med union-find som ett exempel, har vi gått igenom följande steg i utvecklingen av en algoritm: - Bygga en modell av problemet. - Hitta en algoritm för att lösa problemet. - Är den snabb nog? Passar den i minnet? - Om inte, kom på varför. - Hitta ett sätt att fixa problemet. - Iterera tills man är njöd Nästa föreläsningen: - Stackar, bags, och köer - [Enkel-sortering] 60