Sökning och sortering

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

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

Några saker till och lite om snabbare sortering

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

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Några saker till och lite om snabbare sortering

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Sökning. Viktiga algoritmer sökning och sortering. Sökning i en oordnad tabell:

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

Föreläsning 9 Exempel

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Sökning och sortering

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

TDDC74 Lab 02 Listor, sammansatta strukturer

Rekursiva algoritmer sortering sökning mönstermatchning

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 6: Introduktion av listor

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Pascal. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Poster... Poster. Poster... Poster...

Datalogi, grundkurs 1

Symbolisk data. quote. (define a 1) (define b 2) (jacek johan david) (list a b)

Föreläsning REPETITION & EXTENTA

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Föreläsning Datastrukturer (DAT036)

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Lösningar Datastrukturer TDA

Föreläsning 8 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 1

Poster. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Datalogi, grundkurs 1 Övningsuppgifter i Pascal. Serafim Dahl, Carina Edlund, Kjell Lindqvist m.fl.

Föreläsning Datastrukturer (DAT037)

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

SORTERING OCH SÖKNING

Dugga Datastrukturer (DAT036)

Sista delen av kursen

Datalogi, grundkurs 1

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

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Föreläsning 11 Innehåll

Föreläsning 12 Innehåll

Deklarationer/definitioner/specifikationer

Hashing Bakom kulisserna på Pythons dictionary

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 5 Innehåll

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

Funktionell programmering DD1361

Algoritmer, datastrukturer och komplexitet

Föreläsning 9 Datastrukturer (DAT037)

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

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

Föreläsning Datastrukturer (DAT036)

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

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

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

Idag: Dataabstraktion

Standardfilerna Input och Output

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

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

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

TDDC74 Programmering, abstraktion och modellering. Tentamen

Algoritmer, datastrukturer och komplexitet

Föreläsning 11 Datastrukturer (DAT037)

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Tommy Färnqvist, IDA, Linköpings universitet

Abstraktion. Abstraktion... Abstraktion... Abstraktion...

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Datalogi för E Övning 3

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning Datastrukturer (DAT036)

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning Datastrukturer (DAT036)

Fredag 10 juni 2016 kl 8 12

Föreläsning 12 Innehåll

Datalogi, grundkurs 1

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

Föreläsning 8 Datastrukturer (DAT037)

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Föreläsning 10 Datastrukturer (DAT037)

Saker du ska kunna Föreläsning 13 & 14

Ändringsbar (mutable compound) data. TDDC74 Programmering: abstraktion och modellering. Sätta - samman listor kopiering. Hitta sista cons-cellen

Hashing Bakom kulisserna på Pythons dictionary

Hashing Bakom kulisserna på Pythons dictionary. Leta i listor Osorterade listor. Leta i listor Sorterade listor

Sökning och sortering. Linda Mannila

Transkript:

Sökning och sortering Att söka efter data man lagrat undan för senare användning är vanligt Egentligen har man ingen annan anledning för att lagra undan data Har man mycket data och många sökningar måste man fundera över hur man organiserar sina data Riktigt stora mängder data organiseras i specialapplikationer som kallas databaser (en annan kurs) Vi tittar på det mest grundläggande, leta i mindre datamängder, sortera mindre datamängder för snabbare sökning För att förenkla resonemanget tittar vi på numeriska data som vi organiserar på enklast möjliga sätt, i kontinuerliga listor DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 1 / 22

Sökning och sortering - definitioner CONST low high TYPE index keytype vector = 1; {Kan variera, naturligtvis} = 8; {Kan oxå variera} = low..high; = Integer; = ARRAY [index] OF keytype; VAR lista : vector; found : Boolean; location : index; DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 2 / 22

Sökning i oordnad lista PROCEDURE search(var lista: vector; key: keytype; first, last: index; VAR found: Boolean; VAR location: index); VAR i : index; BEGIN found := false; i := first; WHILE (i <= last) AND (NOT found) DO IF lista[i] = key THEN BEGIN found := TRUE; location := i END ELSE i := Succ(i) DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 3 / 22

Sökning med vaktpost i oordnad lista Man kan använda sig av ett trick för att förenkla villkoren i slingan. Man låter det finnas en extra plats (plats 0) där man lagrar det man söker. Då kan man söka bakifrån och slippa kolla index, man hittar ju senast på plats 0. Man kallar det för att använda vaktpost: PROCEDURE search(var lista: vector; key: keytype; first, last: index; VAR found: Boolean; VAR location: index); BEGIN found := false; location := last; lista[0] := key; WHILE lista[location] <> key DO location := Pred(location); found := (location > 0) AND (lista[location] = key) Om listan är ordnad behöver vi inte söka igenom hela listan. Elementen i listan är i stigande ordning. DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 4 / 22

Sökning i ordnad lista PROCEDURE search(var lista: vector; key: keytype; first, last: index; VAR found: Boolean; VAR location: index); VAR i: index; BEGIN found := false; i := first; WHILE (IF i <= last) AND (lista[i] <= key) AND (NOT found) DO IF lista[i] = key THEN BEGIN found := TRUE; location := i END ELSE i := Succ(i); DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 5 / 22

Sökning med vaktpost i sorterad lista Även här kan man använda vaktpost: PROCEDURE search(var lista: vector; key: keytype; first, last: index; VAR found: Boolean; VAR location: index); BEGIN found := false; location := last; lista[0] := key; WHILE lista[location] > key DO location := Pred(location); found := (location > 0) AND (lista[location] = key) Om vi har poster i vektorn: ändra lista[i] = key; resp lista[i] > key; till lista[i].key = key; resp lista[i].key > key; DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 6 / 22

Sökning i oordnad länkad lista PROCEDURE search(var lista: listptr; key: keytype; VAR found: Boolean; VAR location: elementptr); VAR elementref: elementptr; BEGIN found := false; elementref := lista^.first; location := NIL; WHILE (elementref <> NIL) AND (NOT found) DO IF elementref^.key = key THEN BEGIN found := true; location := elementref END ELSE elementref := elementref^.next; Och om den är sorterad i stigande ordning använder vi found för att hitta platsen där elementet borde finnas: DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 7 / 22

Sökning i ordnad länkad lista PROCEDURE search(var lista: listptr; key: keytype; VAR found: Boolean; VAR location: elementptr); VAR elementref: elementptr; BEGIN found := false; elementref := lista^.first; location := NIL; WHILE (elementref <> NIL) AND (NOT found) DO IF elementref^.key = key THEN BEGIN found := true; location := elementref END ELSE IF elementref^.key > key THEN found := true ELSE elementref := elementref^.next; found:= location <> NIL; Vi får eventuellt definiera egna jämförelseoperatorer (=, <, >, osv.) DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 8 / 22

Sökning i sorterad lista binärsökning Om vi söker i en sorterad vektor kan vi söka på ett smartare sätt: Intervallhalveringsmetoden kallas vid sökning för binärsökning. 1. mid := (left+right) / 2 2. om v[mid] >= key så right := mid annars left := mid 3. Om left < right så fortsätt från 1 DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 9 / 22

Binärsökning PROCEDURE binsearch(var v: vector; VAR found: Boolean; key: item; VAR location: index; left,right: index); VAR mid: index; BEGIN WHILE left < right DO BEGIN mid := (left + right + 1) DIV 2; IF key < v[mid] right := mid - 1 ELSE left := mid location := left; found := v[left] = key DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 10 / 22

Sortering Så gott som varje program innehåller delar för att sortera data Om vi söker ofta i våra data och om vi har mycket data blir sortering viktig Eftersom sortering är ett vanligt och tidskrävande moment i bearbetningen har mycket arbete lagts ner på att ta fram bra metoder Vi skall titta på tre enkla (långsamma) metoder. DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 11 / 22

Urvalssortering 1. Sök reda på minsta elementet 2. Byt första och minsta elementen med varandra 3. Om det finns fler element: Sortera resten med samma metod. 23 17 5 13 9 22 2 15 2 17 5 13 9 22 23 15 2 5 17 13 9 22 23 15 DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 12 / 22

Urvalssortering i Pascal PROCEDURE selectionsort(var lista: vector; first, last: index); VAR minpos, i, j : Index; BEGIN FOR i := first TO last -1 DO BEGIN minpos := i; FOR j := i + 1 TO last DO IF lista[j] < lista[minpos] THEN minpos := j; swap(lista, i, minpos) END DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 13 / 22

Urvalssortering i Scheme (define (selection-sort lista) (define (sort lista sorterad-lista) (if (null? lista) sorterad-lista (let ((min (find-min (cdr lista) (car lista)))) (sort (delete min lista) (append sorterad-lista (list min)))))) (sort lista ())) DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 14 / 22

Utbytessortering 1. Gå igenom vektorn, jämför grannar och byt om de står fel 2. Sista elementet står rätt, räkna bort! 3. Om det finns fler element: Sortera med samma metod. 23 17 5 13 9 22 2 15 17 5 13 9 22 2 15 23 5 13 9 17 2 15 22 23 5 9 13 2 15 17 22 23 5 9 2 13 15 17 22 23 5 2 9 13 15 17 22 23 2 5 9 13 15 17 22 23 2 5 9 13 15 17 22 23 DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 15 / 22

Utbytessortering PROCEDURE exchangesort(var lista: vector; first,last: index); VAR i, j : index; BEGIN FOR i := last DOWNTO Succ(first) DO FOR j := first TO Pred(i) DO IF lista[j] > lista[succ(j)] THEN swap(lista, j, Succ(j)); Metoden kan förbättras genom att man avbryter om man inte utfört något byte under ett pass. DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 16 / 22

Bättre utbytessortering PROCEDURE exchangesort(var lista: vector; first,last: index); VAR i, j : index; bytt : Boolean; BEGIN i := last; bytt := true; WHILE bytt AND (i > first) DO BEGIN bytt := false; FOR j := first TO Pred(i) DO IF lista[j] > lista[succ(j)] THEN BEGIN swap(lista[j], lista[succ(j)]); bytt := true i := Pred(i); END DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 17 / 22

Insättningssortering 1. Betrakta vektorn som en redan sorterad del och en osorterad del. 2. Så länge den osorterade delen inte är tom ta ett tal ur den osorterade delen och sortera in i den sorterade delen. 23 17 5 13 9 22 2 15 17 23 5 13 9 22 2 15 5 17 23 13 9 22 2 15 Den här metoden blir elegantast med vaktpost eftersom det annars blir ganska komplicerade villkor; DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 18 / 22

Insättningssortering i Pascal PROCEDURE insertionsort(var v:vector; first,last: Index); VAR i, sorted: Index; BEGIN FOR sorted := Succ(first) TO last DO BEGIN v[0] := v[sorted]; i := Pred(sorted); WHILE v[0] < v[i] DO BEGIN v[succ(i)] := v[i]; i := Pred(i) v[succ(i)] := v[0] END DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 19 / 22

Insättningssortering i Scheme I scheme blir det så här: (define (insertion-sort lista) (define (sortin element lista) (cond ((null? lista) (list element)) ((< element (car lista)) (cons element lista)) (else (cons (car lista) (sortin element (cdr lista)))))) (define (iter-sort lista elements) (if (null? elements) lista (iter-sort (sortin (car elements) lista) (cdr elements)))) (iter-sort () lista)) Metoderna fungerar lika bra för alla typer av element. Ev måste man definiera egna motsvarigheter till >, < och = men i övrigt som förut. Det blir lite mer detaljer för att få ihop koden om vi har diskontinuerliga (länkade) listor men det är inte svårt. DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 20 / 22

Hur bra är det här? Alla tre metoderna består av dubbelloop för jämförelse och flyttning av element. För varje element med index 1 i n För varje element i j n <operationer på vektorn> n (n i + 1) = i=1 n n i=1 n i + i=1 n i=1 1 = n 2 n n + 1 2 + n = n2 2 + n 2 = O(n2 ) Finns det bättre metoder? DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 21 / 22

Enkel analys a<b a<c b<c c<b a<b a<c a<b b c a c<b a b a<c går inte c a<b a<c b går inte a<b<c Ja! Mer om det senare DA2001 (Föreläsning 20) Datalogi 1 Hösten 2010 22 / 22