200 likes | 391 Views
Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II). College 6. Vergelijkingsgebaseerde algoritmen. Enige operaties op objecten zijn: A[ i ] < A[ j ]; A[ i ] > A[ j ]; A[ i ] ³ A[ j ]; A[ i ] £ A[ j ]; A[ i ]==A[ j ] Verplaatsingen
E N D
DatastructurenSorteren: alleen of niet alleen vergelijkingen (II) College 6
Vergelijkingsgebaseerde algoritmen • Enige operaties op objecten zijn: • A[i] < A[j]; A[i] > A[j]; A[i] ³ A[j]; A[i] £ A[j]; A[i]==A[j] • Verplaatsingen • Voorbeelden: Quicksort, Randomized Quicksort, Heapsort, Bubblesort, Insertionsort, … • Allemaal gebruiken ze W(n log n) tijd: • Q(n log n) worst case: Heapsort (…) • Q(n2) worst case, Q(n log n) gemiddeld: Randomized Quicksort • Q(n2) worst case en gemiddeld: Bubble sort
Vorige keer • Een aantal algoritmen die NIET vergelijkingsgebaseerd zijn: • Counting sort • Radix sort • Bucket sort • Deze gebruiken eigenschappen van de waardes: kijken binnenin de waardes • Zijn dan – als die eigenschappen gelden – sneller: O(n) tijd (worst case, verwacht, …) • Werken dus alleen zo snel als die eigenschappen gelden!!!
Vandaag • Ondergrens voor vergelijkings-gebaseerd sorteren (comparison sorts) • Vandaag Datastructuren
De vraag • Vraag: zouden er sorteeralgoritmen die minder dan Q(n lg n) tijd gebruiken? • O(n), O(n lg lg n), O(n Ö (lg n)) ? • Het antwoord is JA en NEE • JA – als we extra aannamen kunnen maken over de input en die gebruiken • NEE – als we dat niet kunnen Datastructuren
Ondergrenzen Voor Sorteren Vijf Datastructuren
Vergelijkingsgebaseerd sorteeralgoritme(herhaling) • In een vergelijkingsgebaseerd sorteeralgoritme(comparison sort) zijn de enige operaties die op de data worden uitgevoerd: • Vergelijkingen:A[i] < A[j]; A[i] > A[j]; A[i] ³ A[j]; A[i] £ A[j]; A[i]==A[j] • Verplaatsingen • De data worden verder niet bekeken om extra informatie er uit te halen waar we de loop van het programma mee beïnvloeden Datastructuren
Allemaal verschillende elementen • We bewijzen: vergelijkingsgebaseerde algoritmen moeten op sommige inputs lg(n!) = Q(n lg n) vergelijkingen doen • We nemen in het bewijs aan dat alle elementen in de array (van lengte n) verschillend zijn • Algoritme moet immers dan ook correct werken Datastructuren
De stelling Stelling Voor ELK vergelijkingsgebaseerd algoritme A: er is een constante c, zodat voor elke n er een input met n elementen is waar A cn lg n vergelijkingen uitvoert (en dus kost A W(n lg n) tijd)
Model van algoritme:Beslissingsboom • Binaire boom, met • Elke knoop heeft twee of nul kinderen • Elke interne knoop is gelabeld met een vergelijkingstest: welke twee (verschillende) elementen (uit oorspronkelijk array) worden met elkaar vergeleken? • Links: als 1e element het kleinste is • Rechts: als 2e element het kleinste is • Bij een blad ... Tja … wat doen we daar? Datastructuren
Beslissingsboom voor Insertion Sort op 3 elementen 1:2 INSERTION-SORT(A) for j = 2 to lengte(A) do key = A[j] i = j – 1; whilei > 0 and A[i] > keydo A[i+1] = A[i] i = i – 1; A[i+1] = key 1:3 2:3 546 1:3 2:3 456 645 654 465 564 In de bladeren staan voorbeeldenvan inputs die daar terecht komen Datastructuren
Bladeren gemarkeerd met een permutatie 1:2 1:3 2:3 {2,1,3} 1:3 2:3 {1,2,3} {3,1,2} {3,2,1} {1,3,2} {2,3,1} Datastructuren
Over beslissingsbomen • Als twee inputs dezelfde ordening hebben, komen ze in hetzelfde blad • Bijvoorbeeld: (4,6,5) of (10, 30, 20) of (2, 47, 42) • Er kunnen testen zich herhalen (bijvoorbeeld in bubble sort) • Er kunnen bladeren zijn waar je nooit terecht kan komen (komt ook in bubble sort voor) • Niet zo belangrijk hoe je precies test (i<j of j<i) etc. • Markeer bladeren met de permutaties die daar terecht komen
Hooguit één permutatie in een blad • Als twee inputs in hetzelfde blad terecht komen, worden dezelfde data-bewegingen uitgevoerd • De inputs worden op dezelfde manier gepermuteerd! • Prima, als we dezelfde sortering op de inputs hebben (als {4,6,5}, {1,3,2} of {12, 49, 25}) • Niet prima, als de inputs anders gesorteerd zijn: want dan is minstens één antwoord fout • In elk blad van de boom staat hooguit één permutatie van {1,2,3,…,n} Datastructuren
Diepte van beslisbomen versus vergelijksgebaseerd sorteren Elke permutatie moet voorkomen in een blad van de beslisboom Elk blad van de beslisboom heeft hooguit 1 permutatie Als er een permutatie in een blad met diepte r zit moeten voor die permutatie r vergelijkingen worden uitgevoerd Er zijn n! permutaties Diepte van een boom met n! bladeren is ondergrens voor vergelijkingsgebaseerd sorteren
Diepte van beslisboom • Als een binaire boom diepte r heeft, heeft de boom maximaal 2r bladeren • Bewijs met inductie naar r. Triviaal als r=0; als r>0, dan wortel heeft twee kinderen met bomen met diepte r-1, dus 2r-1 + 2r-1 bladeren • Een beslisboom voor sorteren van n elementen heeft minstens n! bladeren, dus heeft diepte minstens lg(n!) = Q(n lg n) • lg(n!) < lg(nn) = n lg n • lg(n!) > lg((n/2)n/2) = n/2 * (log n/2) =n/2 * (log n – 1) = W(n lg n) • Want n! > n/2 * (n/2+1) * … * (n-1) * n > (n/2)n/2 Datastructuren
Stelling Stelling: Elk vergelijksgebaseerd algoritme gebruikt voor sommige inputs van lengte nW(n lg n) vergelijkingen en dus W(n lg n) tijd. Gevolg: heapsort en merge sort zijn “asympthotisch optimaal”. Datastructuren
Vijf Conclusies Datastructuren
Sorteren • Zonder gebruik te maken van speciale eigenschappen van input: W(n lg n) • Ondergrensbewijs: aantal vergelijkingen • Met gebruik van speciale eigenschappen: • Sneller, vaak O(n) • Counting Sort • Radix Sort • Bucket Sort • Maar natuurlijk alleen voor inputs die zulke eigenschappen hebben
Conclusies • In de praktijk worden soms hybride methodes gebruikt • Uiterst slimme methoden om heel weinig elementen zo snel mogelijk te sorteren • Overstappen van ene sorteermethode naar andere ergens gedurende algoritme • Voor implementatie van sommige van deze algoritmen (en voor heel veel andere toepassingen) hebben we lijsten nodig • Later kijken we naar implementaties van lijsten en speciale versies: queues en stacks