Föreläsning 11 Datastrukturer (DAT037)

Relevanta dokument
Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 11 Innehåll

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

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

Föreläsning 12 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 12 Innehåll

Föreläsning 9. Sortering

Föreläsning 4 Datastrukturer (DAT037)

Sökning och sortering

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

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Algoritmer. Två gränssnitt

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

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

Föreläsning Datastrukturer (DAT036)

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

Dugga Datastrukturer (DAT036)

Kapitel 7: Analys av sorteringsalgoritmer

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

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 13. Rekursion

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

SORTERING OCH SÖKNING

Datastrukturer D. Föreläsning 2

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

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Föreläsning 1 Datastrukturer (DAT037)

Programmering för språkteknologer II. OH-serie: Sökning och sortering. Algoritm

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Teoretisk del. Facit Tentamen TDDC (6)

Seminarium 13 Innehåll

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 5 Innehåll

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

Algoritmer, datastrukturer och komplexitet

Tentamen Datastrukturer (DAT037)

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Tentamen Datastrukturer D DAT 036/INN960

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Tentamen Datastrukturer D DAT 036/DIT960

Algoritmer, datastrukturer och komplexitet

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

Tentamen Datastrukturer (DAT036)

Föreläsning 5 Datastrukturer (DAT037)

Vad har vi pratat om i kursen?

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning REPETITION & EXTENTA

Några saker till och lite om snabbare sortering

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Sortering. Intern/ extern? Antaganden. Vad kan vi kräva? Rank sort. Rank sort. På en nod/ distribuerad? Jämförelsebaserad/ icke jämförelsebaserad?

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

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

Objektorienterad Programmering DAT043. Föreläsning 10 13/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsning Datastrukturer (DAT036)

Lösning av några vanliga rekurrensekvationer

Sökning och sortering. Linda Mannila

Tommy Färnqvist, IDA, Linköpings universitet. 1 Sortering Heap-sort Merge-sort Sammanfattning... 10

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 8: Exempel och problemlösning

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Lösningar Datastrukturer TDA

Programmering fortsättningskurs

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 8 Innehåll

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Tentamen Datastrukturer, DAT037 (DAT036)

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

Tentamen Datastrukturer (DAT036)

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

Datastrukturer. Sammanfattning och Referenshäfte. Guldbrand, Eric Johansson, Algot

Föreläsning Datastrukturer (DAT037)

Föreläsning 5. Rekursion

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Föreläsning 7 Datastrukturer (DAT037)

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Föreläsning 8 Datastrukturer (DAT037)

Några saker till och lite om snabbare sortering

Transkript:

Föreläsning 11 Datastrukturer (DAT037) Fredrik Lindblad 1 4 december 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 1

Innehåll 2 sortering Urvalssortering Insättningssortering Mergesort Quicksort Heapsort

Sortering 3

Sortering 4 Inte en datastruktur, men Vanligt förekommande uppgift att sortera listor. Välstuderat. Finns i varje standardbibliotek. stabil sortering = element som är lika byter inte plats in-place sortering = konstant extra minnesanvändning (sorting sker på plats) Generisk sorteringsmetod i Java: använd Comparable eller Comparator.

Enkla sorteringsalgoritmer 5 Löser problemet genom att ta ett element (ett par) i taget. Urvalssortering (selection sort) Insättningssortering (insertion sort) Bubble sort

6 Urvalssortering

Urvalssortering 7 Välj minsta bland resterande element och sätt sist i växande lista. Denna sorterade lista innehåller de i minsta elementen. public static void selectionsort(int[] x) { for (int i = 0; i < x.length - 1; i++) { int minidx = i, minval = x[i]; for (int j = i + 1; j < x.length; j++) { if (x[j] < minval) { minval = x[j]; minidx = j; x[minidx] = x[i]; x[i] = minval;

Urvalssortering 8 Ej stabil In-place Tidskomplexitet: O(n 2 ) Antal skrivningar i arrayen: O(n)

9 Insättningssortering

Insättningssortering 10 Sätt in varje element på rätt plats i växande lista. Denna lista är sorterad och innehåller de i första elementen. public static void insertionsort(int[] x) { for (int i = 1; i < x.length; i++) { int j, tmp = x[i]; for (j = i; j > 0 && x[j-1] > tmp; j--) { x[j] = x[j-1]; x[j] = tmp;

Insättningssortering 11 Stabil In-place (Värstafalls)komplexitet: O(n 2 ) Bästafallskomplexitet: O(n), vid sorterad lista. Antal skrivningar i arrayen (i värsta fall): O(n 2 )

Tidskomplexitet 12 Insättningssortering och andra enkla algoritmer (som jämför element parvis) har värstafallskomplexiteten O(n 2 ). Men det går att sortera mer effektivt.

13 Divide and conquer

Divide and conquer 14 Algoritmteknik: söndra och härska (divide and conquer). Om man skapar två delproblem av halv storlek på linjär tid, och dessutom slår ihop delresultaten på linjär tid, så får man en O(n log n)-algoritm.

Mergesort 15

Mergesort 16 Dela listan i två halvor. Sortera varje halva för sig genom rekursivt anrop. Slå ihop (merge) de två halvorna.

Mergesort 17 public static void mergesort(int[] x) { int[] tmp = new int[x.length]; msort(x, tmp, 0, x.length - 1); private static void msort(int[] x, int[] tmp, int l, int r) { if (r <= l) return; int m = l + (r - l) / 2; msort(x, tmp, l, m); msort(x, tmp, m + 1, r); merge(x, tmp, l, m+1, r);

Mergesort private static void merge(int[] x, int[] tmp, int l1, int l2, int r2) { int r1 = l2-1, i = l1; while (l1 <= r1 && l2 <= r2) { if (x[l1] <= x[l2]) tmp[i++] = x[l1++]; else tmp[i++] = x[l2++]; while (l1 <= r1) tmp[i++] = x[l1++]; while (l2 <= r2) tmp[i++] = x[l2++]; for (int j = l1; j <= r2; j++) { x[j] = tmp[j]; 18

Mergesort 19 Värstafallstidskomplexitet (om <= tar konstant tid): merge: Linjär i listornas längd: O( xs + ys ). mergesort: T (0) = 1 T (1) = 1 T (n) = n + T ( n 2 ) + T ( n ), om n 2 2

Mergesort 20 Anta att n = 2 k, k N. T (n) = n + 2T (n/2) = n + 2(n/2 + 2T (n/4)) = 2n + 4T (n/4) = 2n + 4(n/4 + 2T (n/8)) = 3n + 8T (n/8) = = log 2 n n + nt (n/n) = n log 2 n + n = Θ(n log n)

Mergesort 21 Stabil Ej in-place Man kan undvika att kopiera från tmp efter varje merge genom att alternera de två arrayerna. Mergesort kan också implementeras bottom-up. Börja med att sortera n/2 par av listor av längden 1, sedan n/4 par av listor av längden 2, osv.

Quicksort 22

Quicksort 23 Också divide and conquer Jobbet utförs före rekursiva anropen istället för efter. Välj ett element, pivotelementet. Idealt är detta medianen. Fördela alla element så att de mindre än pivot kommer först och de större än pivot sist. Sortera delen med mindre element för sig och delen med större för sig.

Val av pivotelement / Partitioneringsstrategi 24 Viktigt välja pivotelementet p på ett bra sätt, de två delarna ska helst vara ungefär lika stora. Rekommenderade val: Slumpmässigt element. (Kan ta tid att få fram.) Medianen av tre element: första, sista och ett av de mittersta. Att ta första eller sista element som pivot är inte bra. Blir långsamt för sorterade eller nästan sorterade listor. Bör även ha bra strategi för element lika med p.

Quicksort 25 public static void quicksort(int[] x) { qsort(x, 0, x.length - 1); private static void qsort(int[] x, int l, int r) { if (r <= l) return; int pividx = pickpivot(x, l, r); swap(x, pividx, r); int i = split(x, l, r - 1, x[r]); swap(x, i, r); qsort(x, l, i - 1); qsort(x, i + 1, r); private static void swap(int[] x, int i, int j) { int tmp = x[i]; x[i] = x[j]; x[j] = tmp;

Quicksort private static int split(int[] x, int l, int r, int piv) { // returns first idx with bigger element for (;;) { while (l < r && x[l] < piv) l++; while (l < r && x[r] > piv) r--; if (l == r) break; swap(x, l++, r--); if (l == r + 1) return l; return x[l] < piv? l + 1 : l; private static int pickpivot(int[] x, int l, int r) { // returns idx of selected pivot return l + (r - l) / 2; // simply picks middle elt 26

27 Tidskomplexitet: I värsta fallet (bara dåliga val av p): Θ(n 2 ). Bara bra val av p: O(n log n). Medelkomplexitet (med bra implementation): O(n log n).

Quicksort 28 Svårt att få stabil. (Blir typisk ej in-place om man gör den stabil.) In-place (bortsett från utrymmet på anropsstacken som går åt för de rekursiva anropen). Mindre minnesomflyttning men fler jämförelser än Mergesort. Detta kan avgöra vilken man ska välja.

Heapsort 29

Prioritetskösortering 30 Enkel sorteringsalgoritm: Sätt in varje element, kör delete-min tills kön är tom. O(n log n) om insert och delete-min har tidskomplexiteten O(log n).

Heapsort 31 Variant av den enkla prioritetskösorteringsalgoritmen. In-place: Kräver O(1) extra minne. Ej stabil.

Heapsort 32 Bygg binär maxheap in-place med build-heap (med roten på position 0). Kör delete-max upprepade gånger. Lägg största elementet sist i arrayen, nästa element näst sist, och så vidare.