Datastructuren Sorteren, zoeken en tijdsanalyse

Slides:



Advertisements
Verwante presentaties
Sudoku puzzels: hoe los je ze op en hoe maak je ze?
Advertisements

Downloaden: Ad-aware. Downloaden bestaat uit 3 delen: •1. Zoeken naar de plek waar je het bestand kan vinden op het internet •2. Het nemen van een kopie.
Beter afspelen.
“ff Anders”.  Het thema van dit jaar is “ff Anders” 2.
ÉÉN GOD, DE VADER 3 nov Rotterdam.
Datastructuren Quicksort
Hoofdstuk 8: Recursie.
Ronde (Sport & Spel) Quiz Night !
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen.
Klaar met school en dan…? Kansen op de arbeidsmarkt en hoe pak je die? Jos Sanders, TNO.
Datastructuren Analyse van Algoritmen en O
Datastructuren Analyse van Algoritmen en O
‘Inleiding programmeren in Java’ SWI cursus: ‘Inleiding programmeren in Java’ 4e college Woe 19 januari 2000 drs. F. de Vries.
1 Tentamen 21 januari 2008 uitleg Algemene kennisvragen a)“Wat verstaan we onder de complexiteit van een algoritme?” –Cruciaal: wat gebeurt er met.
Hoofdstuk 6: Controle structuren
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
1 Datastructuren Lijstjes (Stacks & Queues) Onderwerp 7.
Fibonacci & Friends Met dank aan Gerard Tel.
Datastructuren Zoekbomen
1 Datastructuren Heapsort College 4. 2 Vandaag  Kort: ADT vs Datastructuur  Heaps en Heapsort  Tijd over: ondergrenzen voor sorteren; nog sneller sorteren.
1 Datastructuren Zoekbomen II Invoegen en weglaten.
Datastructuren en Algoritmen
Datastructuren en Algoritmen Datastructuren college 1.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II) College 6.
Visibility-based Probabilistic Roadmaps for Motion Planning Tim Schlechter 13 februari 2003.
Parallelle Algoritmen String matching. 1 Beter algoritme patroonanalyse Bottleneck in eenvoudig algoritme: WITNESS(j) (j = kandidaat in eerste i-blok)
Neurale Netwerken Kunstmatige Intelligentie Rijksuniversiteit Groningen April 2005.
1 Complexiteit Bij motion planning is er sprake van drie typen van complexiteit –Complexiteit van de obstakels (aantal, aantal hoekpunten, algebraische.
1 Datastructuren Quicksort en andere sorteermethoden College 3.
1 Datastructuren Skiplists. 2 Skiplists  Vrij eenvoudige datastructuur  “Makkelijker” dan gebalanceerde bomen  Kunnen hetzelfde als gebalanceerde bomen.
1 Optuigen van datastructuren 2 Dynamische order statistics (2)
Optuigen van datastructuren
Datastructuren Sorteren: bubble, merge, quick
1 Datastructuren Heapsort (2e deel) College 5. 2 Vandaag  Heaps en Heapsort  (eind)  Nog sneller sorteren:  Ondergrenzen  Linair sorteren.
Datastructuren Sorteren, zoeken en tijdsanalyse
Werken aan Intergenerationele Samenwerking en Expertise.
ribwis1 Toegepaste wiskunde Lesweek 01 – Deel B
Statistiekbegrippen en hoe je ze berekent!!
Optuigen van datastructuren Datastructuren Onderwerp 11.
1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13.
Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen van.
Sorteeralgoritmen. Sorteren: aanpak 1 Hoe ga je een rij getallen sorteren met PC? Sorteren door selectie (= selection sort): Zoek de kleinste waarde Sorteer.
Voorrangsregels bij rekenen (1)
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
2 januari 2009Nieuwjaarsreceptie "Meule wal straete" 1 Nieuwjaarsreceptie 2 januari 2009 Eerste bijeenkomst van de bewoners van de “Meule wal straete”
Hoofdstuk 5 Vijfkaart hoog, eerste verkenning 1e9 NdF-h1 NdF-h5 1 1.
Algoritme Inhoud: Definitie algoritme Recursieve algoritmes Opgaven
De financiële functie: Integrale bedrijfsanalyse©
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
ZijActief Koningslust
Intermezzo: Queries op zoekbomen Datastructuren. Queries: hoe op te lossen We hebben: – Een zoekboom (gewoon, rood-zwart, AVL,…) – Een vraag / querie.
T U Delft Parallel and Distributed Systems group PGS Fundamentele Informatica in345 Deel 2 College 6 Cees Witteveen.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
1 Datastructuren Quicksort College 3. 2 Vorige keren  O-notaties  Sorteren: insertion sort, bubble sort  Kosten (n 2 ) tijd in het slechtste geval.
Datastructuren en Algoritmen
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen (vorige keer) Hashtabellen –Oplossen van botsingen met “ketens” (chaining) Vorige.
1 Datastructuren Sorteren, zoeken en tijdsanalyse College 2.
1 Datastructuren Analyse van algorithmen (vervolg) Heapsort College 4.
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
Gecijferdheid les 1.4 Grootst gemene deler Kleinst gemene veelvoud
Minimum Opspannende Bomen Algoritmiek. 2 Inhoud Het minimum opspannende bomen probleem Een principe om een minimum opspannende boom te laten groeien Twee.
Doorzoeken van grafen Algoritmiek. Algoritmiek: Divide & Conquer2 Vandaag Methoden om door grafen te wandelen –Depth First Search –Breadth First Search.
Divide & Conquer: Verdeel en Heers vervolg Algoritmiek.
Datastructuren voor graafrepresentatie
Minimum Opspannende Bomen
Small Basic Console deel 2
Python – For loop + strings
Transcript van de presentatie:

Datastructuren Sorteren, zoeken en tijdsanalyse College 2

Vandaag Medelingen over werkcolleg O-notatie Binary search Sorteren: analyse van insertion sort Bubble sort Merge Sort Heapsort

Werkcollege Kies een tijdstip (di+do OF wo+vr) voor het werkcollege Kom naar de 1e bijeenkomst (volgende week dinsdag of woensdag) van Uw groep Precieze zaal/groep (1, 2, 2a) of (3, 3a) wordt dan gemaakt Kijk ook zelf even welke zaal ‘t leegst is Blijf daarna steeds naar dezelfde groep gaan NB: in de toegestane 4 keer afwezigheid zitten afwezigheid voor goede redenen bevat

Waarom O-notatie Hoeveel operaties is nu eigenlijk een test als if (A[i+1] > x) OR (x == 0) ? In elk geval: een constant aantal. Om dit niet precies te hoeven bekijken is de O-notatie bedacht: verstopt constanten in de notatie 8, 9, 20203, 1: allemaal O(1) n, 4n, 10n + log(n), 21n: allemaal O(n) Datastructuren

“Asympthotic notation” O: asympthotische bovengrens Formeel: O(g(n)) = { f(n) | er zijn positieve constanten c en r, zodat 0 £ f(n) £ c * g(n) voor alle n ³ r} O(g(n)) is dus een verzameling functies. In plaats van de schrijven f(n) Î O(g(n)) schrijft men echter f(n)=O(g(n)) Intuitie: we schrijven f(n) = O(g(n)) als vanaf een bepaalde waarde van n (soms 0, soms meer) f(n) nooit meer dan een vaste constante keer g(n) is. Dus: 3n2 = O(n2) Nog meer voorbeelden (zometeen) Feitelijk: laat de constante factor weg, en laat langzamer groeiende functies weg Datastructuren

Voorbeelden n2 + 4n + 6 log n3 12n + log n + 3 r2 – 10 23n+4 O(n^2), O(log n) want = 3 log n, O(n), O(r^2), O(8^n) of O(2^{3n}) want 16* 2^{3n} Datastructuren

Zoeken in een gesorteerde rij Array met elementen A[1], …, A[n] Gegeven een x, is er een i met A[i] == x, en zo ja, welke i? We zagen al een algoritme dat dit oplost in O(n) tijd: bekijk de elementen van 1 t/m n totdat je x tegenkomt of alles bekeken hebt Als de rij getallen gesorteerd is kan het sneller met een simpel maar belangrijk principe: binary search Dus: neem aan: A[1] £ A[2] £ A[3] £ … £ A[n-1] £ A[n]

Binary search Idee: houdt twee variabelen bij onder en boven, zodat x, als x in A zit, “tussen” onder en boven zit Invariant: als er een i is met A[i] == x, dan onder £ i £ boven

Pseudocode {Input: Gesorteerde array A[1 … n] , element x} {Output: index i met A[i] == x, and 0 als zo’n i niet bestaat} onder = 1; boven = n; while (onder < boven) do mid = ë (onder+boven)/2 û ; if (A[mid] < x) then onder = mid+1 else boven = mid if (A[onder] == x) then return onder else return 0 (zit er niet in)

Sorteeralgoritmen Aantal algoritmen om te sorteren Staart vorige keer: insertion sort Simpel algoritme: bubble sort Sneller: merge sort (ritsen) Ook snel: heapsort (met datastructuur: heap) In de praktijk heel snel: quicksort

Insertion sort Sorteeralgoritme, met volgende idee: Voeg steeds één element toe op de goede plek We hebben een steeds groter goedgesorteerd deel Array A loopt van 1 t/m lengte(A) INSERTION-SORT(A) for j = 2 to lengte(A) do key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key Datastructuren

Tijdsanalyse van INSERTION-SORT 1 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Eerst dit: Hoeveel stappen kost één slag van de loop voor 1 bepaalde waarde van j ? Weer een loop. Elke doorgang door de loop kost iets van 8 elementaire stappen Deze loop gaan we hooguit j keer rond Nog eens 6 operaties buiten de loop Dus 8 j + 6 operaties voor deze slag Datastructuren

Tijdsanalyse van INSERTION-SORT 2 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Hoeveel stappen kost één slag van de loop voor een bepaalde waarde van j ? 8 j + 6 of minder We doen dit voor j=2, 3, … , tot lengte(A)=n Totaal: constante keer n2 Schrijven we als O(n2) Datastructuren

Voor en nadelen insertion-sort Voordelen Eenvoudig Geen extra geheugen Snel als rij al gesorteerd Nadelen Langzaam: O(n2)

Bubblesort Verwissel: hulp = a[i]; a[i] = a[i+1]; a[i+1] = hulp; Eenvoudig sorteeralgoritme repeat change = false; for i=1 to n-1 do if (a[i] > a[i+1]) then verwissel a[i] en a[i+1] van plaats change = true until (change == false) Verwissel: hulp = a[i]; a[i] = a[i+1]; a[i+1] = hulp; Hoe snel? Correct?

Correctheid en tijd bubble sort Als we klaar zijn is de array gesorteerd; we hebben steeds een permutatie van de input Terminatie? Ja, want Na i keer de hoofdloop gedaan te hebben staan op posities n - i +1, n – i +2, … , n de i grootste getallen in de array Dus: na hooguit n keer de hoofdloop te doen, is het array gesorteerd en zijn we klaar

Tijd Verwissel: O(1) repeat Binnenste deel: O(1) For: n keer O(1): O(n) Totaal: n keer O(n): O(n2) Er zijn ook inputs waar zo’n n2 stappen gedaan worden, bijv.: het omgekeerde van een gesorteerde array (10, 9, 8, 7, 6, 5, 4, 3, 2, 1) repeat change = false; for i=1 to n-1 do if (a[i] > a[i+1]) then verwissel a[i] en a[i+1] van plaats change = true until (change == false)

Mergesort

Algoritmische methode: divide and conquer (verdeel en heers) Mergesort Algoritmische methode: divide and conquer (verdeel en heers) Splits probleem in deelstukken Los elk deelstuk afzonderlijk op Combineer oplossing van deelstukken Mergesort gebruikt divide and conquer strategie Sorteer eerst, recursief de 1e helft van de array Sorteer daarna, recursief, de 2e helft van de array Voeg de twee gesorteerde helften samen door een soort van ‘ritsen’

Merge-sort I Mergesort(A, p, r) {Input: array A, integers p, r, met 1£ p £ r £ lengte(A)} {Output: A[p..r] is gesorteerd en bevat dezelfde elementen als A[p..r] in input} If (p ³ r) then doe niets else midden = ë (p+r)/2 û ; Mergesort(A,p, midden); Mergesort(A,midden+1,r); Merge(A,p,midden,r); {“Rits” de twee stukken in elkaar”}

Merge(A,p,q,r) (deel 1) {Input: A[p…q] is gesorteerd, en A[q+1…r] is gesorteerd} {Output: A[p…r] is gesorteerd} n1 = q – p +1; n2 = r – q; Maak een array L[1…n1+1]; Maak een array R[1..n2+1]; for i=1 to N1 do L[i] = A[p+i – 1]; for j=1 to N2 do R[j] = A[q+j]; (rest komt zometeen) Eerst copieren in arrays L en R

Merge deel 2 n1 = q – p +1; n2 = r – q; Maak een array L[1…n1+1]; Maak een array R[1..n2+1]; for i=1 to n1 do L[i] = A[p+i – 1]; for j=1 to n2 do R[j] = A[q+j]; L[n1] = MAXINT; {Stootblok (sentinel)} L[n2] = MAXINT; {Stootblok}

Merge deel 2 for k = p to r do pleklinks = 1; plekrechts = 1; n1 = q – p +1; n2 = r – q; Maak arrays L[1…n1+1] en R[1..n2+1]; for i=1 to n1 do L[i] = A[p+i – 1]; for j=1 to n2 do R[j] = A[q+j]; L[n1] = MAXINT; {Stootblok} L[n2] = MAXINT; {Stootblok} pleklinks = 1; plekrechts = 1; for k = p to r do {Vind het element op positie k in A} if (L(pleklinks) £ R(plekrechts)) then A[k] = L(pleklinks); pleklinks ++; else A[k] = R[plekrechts); plekrechts ++;

Invariant geldt initieel, en blijft gelden Correctheid merge Invariant Aan het begin van de for-loop gelden: A[p…k-1] bevat de k-p kleinste elementen uit L[1..n1+1] en R[1..n2+1] A[p…k-1] is gesorteerd L[pleklinks] is het kleinste element in L dat niet teruggezet is naar A r[plekrechts] is het kleinste element in R dat niet teruggezet is naar A Invariant geldt initieel, en blijft gelden Bij terminatie: k = r+1; en dus ... 

Tijd van mergesort Wat is de tijd van een enkele mergeoperatie? Als we twee stukken van lengte r mergen: O(r) (want…) Analyse van mergesort hier wat informeler – kijk naar de “berekeningsboom”

log n niveau’s

Tijd van mergesort O(n log n)

Next: Heapsort