SORTERING OCH SÖKNING



Relevanta dokument
BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

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

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

Föreläsning 11 Datastrukturer (DAT037)

Magnus Nielsen, IDA, Linköpings universitet

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Tentamen Datastrukturer D DAT 036/DIT960

Sätt att skriva ut binärträd

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

Algoritmer. Två gränssnitt

Några saker till och lite om snabbare sortering

Kapitel 7: Analys av sorteringsalgoritmer

Föreläsning 12 Innehåll

Föreläsning 11 Innehåll

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

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Dugga Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 12 Innehåll

Datastrukturer D. Föreläsning 2

Att använda pekare i. C-kod

Tentamen: Programutveckling ht 2015

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Föreläsning 9. Sortering

Sökning och sortering

Datastrukturer och algoritmer

Lösningar Datastrukturer TDA

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

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

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

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

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

Några saker till och lite om snabbare sortering

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

FÖRELÄSNING 12 DATALOGI I

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

Föreläsning REPETITION & EXTENTA

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Sökning och sortering

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

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

Tentamen Datastrukturer (DAT036)

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

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

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

Föreläsning 7: Syntaxanalys

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

Datastrukturer. föreläsning 3. Stacks 1

Några svar till TDDC70/91 Datastrukturer och algoritmer

Skizz till en enkel databas

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

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

4 Sammansatta datatyper

Föreläsning 6: Introduktion av listor

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

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

OOP Objekt-orienterad programmering

Datastrukturer. föreläsning 2

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

Tentamen Datastrukturer D DAT 036/INN960

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Föreläsning 5 Innehåll

Tentamen Datastrukturer D DAT 036/INN960

Tentamen OOP

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

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

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

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

Tentamen Datastrukturer (DAT036)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

Exempeltenta GruDat 2002/2003

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

Symboliska konstanter const

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

Tentamen i DD2387 Programsystemkonstruktion med C++

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 1. Introduktion. Vad är en algoritm?

Facit Tentamen TDDC kl (6)

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

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 11. Giriga algoritmer

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

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

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

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

Programmeringsteknik med C och Matlab

UMEÅ UNIVERSITET 26 april 2002 Instutionen för datavetenskap. Grafproblem. Laboration 4, Datastrukturer och Algoritmer VT02

TDIU01 - Programmering i C++, grundkurs

Transkript:

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 1 C-språket 2/Kary Främling v2000 och Göran Pulkkis v2003 SORTERING OCH SÖKNING Sortering är ett av de bästa exemplen på problem där valet av lösningsalgoritm radikalt kan ändra på exekveringstiden. Exempel på sorteringalgoritmer, ordnade från den långsammaste till den snabbaste är (den intresserade läsaren kan lätt hitta beskrivningar av dem i flera olika böcker): Insertion sort Shell sort Heapsort Mergesort Quicksort Det är relativt enkelt att programmera en sorteringsalgoritm som fungerar, men vars sorteringstid växer exponentiellt då datamängden att sortera växer. Quicksort-algoritmen är den som används oftast eftersom den för de flesta problem är den snabbaste. Dess exekveringstid växer i medeltal i proportionen n*log(n), d.v.s att exekveringstiden hålls inom rimliga gränser även med mycket stora mängder data. Detta betyder att Quicksortalgoritmens komplexitet är O(n*log(n)), då n betecknar antalet tabellelement. Exempel 1 visar en implementering av quicksort, som är relativt lätt att skriva om och generalisera för vilken sorts data som helst. Exempel 1. Implementering av Quicksort (kompilerat och kört). Se boken WEISS: Data Structures and Algorithm Analysis in C. #include <stdio.h> #define MIN_DATA 0 #define CUTOFF 10 typedef int InputType; void quicksort(inputtype a[], unsigned int n); void q_sort(inputtype a[], int left, int right); InputType median3(inputtype a[], int left, int right); void insertion_sort(inputtype a[], unsigned int n); void swap(inputtype *a, InputType *b);

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 2 main() int i; InputType itab[] = 0, 34, 8, 64, 51, 32, 21, 55, 88, 9, 11, 33, 54, 72, 25, 39, 21, 57, 93, 6, 17, 22, 64, 75, 83, 31, 19, 64, 98, 5, 13, 57, 51, 71, 21, 33, 85, 91, 37, 7, 18 ; printf("osorterad tabell\n"); for ( i = 1 ; i <= 40 ; i++ ) if ( i%10 == 0 ) printf("\n"); quicksort(itab, 40); printf("sorterad tabell\n"); for ( i = 1 ; i <= 40 ; i++ ) if ( i%10 == 0 ) printf("\n"); void quicksort(inputtype a[], unsigned int n) q_sort(a, 1, n); insertion_sort(a, n); void q_sort(inputtype a[], int left, int right) int i, j; InputType pivot; if ( left + CUTOFF <= right ) pivot = median3(a, left, right); i = left; j = right - 1; for ( ;; ) while ( a[++i] < pivot ); while ( a[--j] > pivot ); if ( i < j ) swap(&a[i], &a[j]); else break; swap(&a[i], &a[right - 1]); /* restore pivot */ q_sort(a, left, i - 1); q_sort(a, i + 1, right); /* Return median of left, center and right. */ /* Order these and hide pivot */

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 3 InputType median3(inputtype a[], int left, int right) int center; center = (left + right)/2; if ( a[left] > a[center] ) swap(&a[left], &a[center]); if ( a[left] > a[right] ) swap(&a[left], &a[right]); if ( a[center] > a[right] ) swap(&a[center], &a[right]); /* invariant: a[left] <= a[center] <= a[right] */ swap(&a[center], &a[right - 1]); /* hide pivot */ return a[right - 1]; /* return pivot */ void insertion_sort(inputtype a[], unsigned int n) unsigned int j, p; InputType tmp; a[0] = MIN_DATA; /* sentinel */ for ( p = 2 ; p <= n ; p++ ) tmp = a[p]; for ( j = p ; tmp < a[j - 1] ; j-- ) a[j] = a[j - 1]; a[j] = tmp; void swap(inputtype *a, InputType *b) InputType tmp; tmp = *a; *a = *b; *b = tmp; Programmet körs: goran@xena:~/cprog2$ quick1 Osorterad tabell 34 8 64 51 32 21 55 88 9 11 33 54 72 25 39 21 57 93 6 17 22 64 75 83 31 19 64 98 5 13 57 51 71 21 33 85 91 37 7 18 Sorterad tabell 5 6 7 8 9 11 13 17 18 19 21 21 21 22 25 31 32 33 33 34 37 39 51 51 54 55 57 57 64 64 64 71 72 75 83 85 88 91 93 98

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 4 I Exempel 1 sorteras en tabell av heltal, men genom att ändra på datatypen InputType skulle vilken typ av data som helst kunna sorteras. Quicksort är en algoritm som delar upp tabellen som skall sorteras i mindre tabeller som sorteras rekursivt. Precis som i kapitlet om binära träd är det ytterst viktigt att välja rätt mittenvärde (pivot) fôr att sorteringen skall vara snabb. Detta utförs av funktionen median3, som dessutom gör en liten delsortering som är viktig för algoritmens hastighet. I det här fallet utförs sorteringen inte till slut med quicksort, utan den slutgiltiga sortering görs genom insertion sort som är mycket snabbt för nästan sorterad data. Enligt test som utförts är detta ca. 15% snabbare än att utföra sorteringen helt till slut med quicksort. Konstanten CUTOFF bestämmer hur långt sorteringen görs med quicksort. I Exempel 1 har tabellens första element reserverats för algoritmens behov, varför datan att sortera börjar först från index 1. Eftersom quicksort så tydligt är den snabbaste sorteringsalgoritmen för de flesta problem, finns det i C inkluderat en standardfunktion qsort som implementerar den. Exempel 2 visar hur den kan användas för att sortera samma heltalstabell som i det förra exemplet.

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 5 Exempel 2. Användning av standardfunktionerna qsort och bsearch (kompilerat och kört) #include <stdio.h> #include <stdlib.h> #include <string.h> #define NELEMS(arr) (sizeof(arr) / sizeof(arr[0])) typedef int InputType; int sortfunction( const void *a, const void *b); main() int i, index; InputType itab[] = 34, 8, 64, 51, 32, 21, 55, 88, 9, 11, 33, 54, 72, 25, 39, 21, 57, 93, 6, 17, 22, 64, 75, 83, 31, 19, 64, 98, 5, 13, 57, 51, 71, 21, 33, 85, 91, 37, 7, 18 ; InputType *itemptr, key; printf("osorterad tabell\n"); for ( i = 0 ; i < NELEMS(itab) ; i++) if ( (i + 1)%10 == 0 ) printf("\n"); printf("\n"); qsort((void *)itab, NELEMS(itab), sizeof(inputtype), sortfunction); printf("sorterad tabell\n"); for ( i = 0 ; i < NELEMS(itab) ; i++) if ( (i + 1)%10 == 0 ) printf("\n"); printf("\n"); key = 31; itemptr = (InputType*) bsearch (&key, itab, NELEMS(itab), sizeof(inputtype), sortfunction); if ( itemptr!= NULL ) index=itemptr-itab; printf("number %d found at index %d\n",key,index); else printf("number %d not found!\n", key); int sortfunction(const void *a, const void *b) if ( *((InputType*)a) > *((InputType*)b) ) return 1; if ( *((InputType*)a) < *((InputType*)b) ) return -1; return 0;

Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 6 Programmet körs: goran@xena:~/cprog2$ quick2 Osorterad tabell 34 8 64 51 32 21 55 88 9 11 33 54 72 25 39 21 57 93 6 17 22 64 75 83 31 19 64 98 5 13 57 51 71 21 33 85 91 37 7 18 Sorterad tabell 5 6 7 8 9 11 13 17 18 19 21 21 21 22 25 31 32 33 33 34 37 39 51 51 54 55 57 57 64 64 64 71 72 75 83 85 88 91 93 98 Number 31 found at index 15 Det finns även en standardfunktion för att snabbt granska om ett givet element är inkluderat i en sorterad tabell. Funktionen heter bsearch och utför en snabb binär sökning i tabellen.