Logaritmiske sorteringsalgoritmer

Like dokumenter
Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Quicksort. Fra idé til algoritme.

Datastrukturer for rask søking

Rekursiv programmering

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

INF2220: Time 12 - Sortering

INF1010 notat: Binærsøking og quicksort

Definisjon av binært søketre

Rekursiv programmering

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Innhold. Innledning 1

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

Binær heap. En heap er et komplett binært tre:

Øvingsforelesning 6. Sorteringsalgoritmer. Martin Kirkholt Melhus Basert på foiler av Kristian Veøy 30/09/14 1

Quicksort. Lars Vidar Magnusson Kapittel 7 Quicksort Randomisert Quicksort Analyse av Quicksort

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Definisjon: Et sortert tre

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Læringsmål og pensum. Algoritmeeffektivitet

INF2220: Time 4 - Heap, Huffmann

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

TDT4105 Informasjonsteknologi, grunnkurs

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Et eksempel: Åtterspillet

Algoritmer - definisjon

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer

Et eksempel: Åtterspillet

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Binære trær: Noen algoritmer og anvendelser

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

ALGORITMER OG DATASTRUKTURER

Sortering i Lineær Tid

Palindrom - iterativt

IN Algoritmer og datastrukturer

Kap.8 Sortering og søking sist oppdatert 16.03

Pensum: fra boken (H-03)+ forelesninger

Hashing: Håndtering av kollisjoner

Liste som abstrakt konsept/datatype

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

O-notasjon og kompleksitet

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Kapittel 12: Rekursjon

Tildeling av minne til prosesser

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Effektiv eksekvering av spørsmål

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Løsningsforslag for utvalgte oppgaver fra kapittel 3

Divide-and-Conquer. Lars Vidar Magnusson

Når Merge sort og Insertion sort samarbeider

Backtracking som løsningsmetode

Løsnings forslag i java In115, Våren 1998

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Algoritmeanalyse. (og litt om datastrukturer)

Algoritmer og Datastrukturer IAI 21899

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Backtracking som løsningsmetode

Effektiv eksekvering av spørsmål

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Tildeling av minne til prosesser

Effektiv eksekvering av spørsmål

Algoritmer - definisjon

Fig1. Den konvekse innhyllinga av 100 tilfeldige punkter i planet (de samme som nyttes i oppgaven.)

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

UNIVERSITETET I OSLO

Transkript:

Logaritmiske sorteringsalgoritmer

Logaritmisk sortering Rekursive og splitt og hersk metoder: Deler verdiene i arrayen i to (helst) omtrent like store deler i henhold til et eller annet delingskriterium Hver mindre del sorteres rekursivt på samme måte Delene settes deretter sammen til ferdig sortert array Er mer effektivt, oftest O(n log(n)) To logaritmiske metoder i dette kurset: Quicksort Flettesortering

Effektivitet av logaritmiske sorteringsalgoritmer Hvis vi deler arrayen i to omtrent like store deler hver gang, blir det ca. log(n) nivåer med rekursive kall Hvis arbeidet som gjøre på hvert nivå samlet er O(n), vil hele sorteringen bli O(n log(n)) Hvis oppdelingen er svært skjev (en stor og en svært liten del) kan vi få opp til n rekursive nivåer, og algoritmens effektivitet kan synke til O(n 2 )

Quicksort Tony Hoare, 1960 Algoritmen eg. laget for automatisk oversetting Oftest meget rask i praksis Virker for generelle sorteringsproblemer Krever svært lite ekstra hukommelse Gjennomsnittlig effektivitet er O(n log(n)) Worst-case er O(n2 )

Quicksort: Sortere array A av lengde n Hvis n > 1: Velg et element p (partisjoneringselement) i A, f.eks. element nr. 0 eller nr. n/2 * Bytt om på elementene i A (partisjonér arrayen) slik at den deles i to deler: Alle elementer som er mindre eller lik p står til venstre Alle elementer som er større enn p står til høyre Partisjoneringselementet p står mellom de to delene Sortér de to delene rekursivt med quicksort, hele arrayen er da ferdig sortert *: Lærebokens valg

Quicksort: Eksempel Bruker første element til å partisjonere delarrayene Nivå 1: 26 33 35 29 19 12 22 19 22 12 26 29 35 33 Nivå 2: 19 22 12 26 29 35 33 12 19 22 26 29 35 33 Nivå 3: 12 19 22 26 29 35 33 12 19 22 26 29 33 35 Ferdig: 12 19 22 26 29 33 35

Quicksort: Et eksempel til Nivå 1: 65 57 81 92 43 31 26 75 13 10 26 57 10 13 43 31 65 75 92 81 Nivå 2: 26 57 10 13 43 31 65 75 92 81 10 13 26 57 43 31 65 75 92 81 Nivå 3: 10 13 26 57 43 31 65 75 92 81 10 13 26 43 31 57 65 75 81 92 Nivå 4: 10 13 26 43 31 57 65 75 81 92 10 13 26 31 43 57 65 75 81 92 Ferdig: 10 13 26 31 43 57 65 75 81 92

Partisjoneringsalgoritmen 6 8 1 4 9 0 3 5 2 7 6 er partisjoneringselement 6 8 1 4 9 0 3 5 2 7 7 står riktig plassert 6 8 1 4 9 0 3 5 2 7 swap 2 og 8 6 2 1 4 9 0 3 5 8 7 1 står riktig plassert 6 2 1 4 9 0 3 5 8 7 4 står riktig plassert 6 2 1 4 9 0 3 5 8 7 swap 5 og 9 6 2 1 4 5 0 3 9 8 7 0 og 3 står riktig plassert 3 2 1 4 5 0 6 9 8 7 swap 6 og 3, ferdig

Quicksort: Animasjon

Effektivitet og implementasjon Implementeres med to rekursive kall, der parameterene er øvre og nedre indeks for arraysegmentet som skal sorteres Skiller ut partisjoneringen i en egen metode Er O(n log(n)) i gjennomsnitt (random data) Hvis partisjoneringen gir mange skjeve oppdelinger (f.eks. ved nesten sorterte data) vil Quicksort dele opp arrayen ~n ganger, og algoritmen blir O(n 2 ) Se Java-koden

Effektivisering av Quicksort Forbedring av valg av partisjoneringselement, for å redusere muligheten for skjev oppdeling: Sammenlign f.eks. elementene på indeksene 0, n/2 og n -1, og bruk verdien som er i midten Ikke la rekursjonen gå helt ned til lengde lik 1: Bruk en enklere og lettere ikke-rekursiv metode, f.eks. innstikksortering, til å sortere korte segmenter av arrayen

Flettesortering (merge sort) John von Neumann(!), 1945 Velegnet for steinalderens sekvensielle lagringsmedia som magnettape, papirtape og hullkort Utmerket for sortering av lenkede lister (oppgave) Garanterer O(n log(n)) effektivitet Standard implementasjon krever bruk av ekstra arrayer til å kopiere dataene frem og tilbake under sorteringen

Flettesortering av array A av lengde n Hvis n > 1: Sortér nedre og øvre halvdel av A hver for seg, rekursivt med flettesortering Flett de to halvdelene sammen til en sortert array Hele arrayen er da ferdig sortert

Flettesortering: Eksempel 26 33 35 29 19 12 22 26 33 35 29 19 12 22 oppdeling 26 33 35 29 19 12 22 oppdeling 26 33 35 29 19 12 22 bunn i rekursjonen 26 33 29 35 12 19 22 fletting 26 29 33 35 12 19 22 fletting 12 19 22 26 29 33 35 ferdig

Fletting av to sorterte arraysegmenter 1 13 24 26 2 15 27 38 1 13 24 26 2 15 27 38 1 1 13 24 26 2 15 27 38 1 2 1 13 24 26 2 15 27 38 1 2 13 1 13 24 26 2 15 27 38 1 2 13 15 1 13 24 26 2 15 27 38 1 2 13 15 24 1 13 24 26 2 15 27 38 1 2 13 15 24 26 1 13 24 26 2 15 27 38 1 2 13 15 24 26 27 1 13 24 26 2 15 27 38 1 2 13 15 24 26 27 38

Flettesortering: Kalltre for n = 7

Flettesortering: Animasjon

Effektivitet og implementasjon Implementeres med to rekursive kall, parametrene er øvre og nedre indeks for arraysegmentet som skal sorteres Flettingen gjøres ved å kopiere dataene over i en ekstra array og deretter flette de to halvdelene tilbake Programmering av flettingen krever litt indeksfikling Er alltid O(n log(n)), men krever O(n) ekstra hukommelse i tillegg til arrayen som sorteres* Se Java-koden *: Flettesortering kan implementeres med konstant plassforbruk, komplisert algoritme

Quicksort vs. flettesortering Quicksort er vesentlig raskere i de aller fleste tilfeller Flettesortering må alltid flytte data mellom temporær og original array og blir derfor langsommere Flettesortering er alltid O(n log(n)), men... Hvis det er viktig med garantert O(n log(n)) oppførsel, er det bedre å bruke en in-house algoritme som ikke swapper så mye, som f.eks. heapsort Se testprogram for sorteringer