Palindrom - iterativt

Like dokumenter
O-notasjon og kompleksitet

TDT4105 Informasjonsteknologi, grunnkurs

TDT4105 Informasjonsteknologi, grunnkurs. Mer om funksjoner: - rekursive funksjoner

TDT4105 Informasjonsteknologi, grunnkurs. Matlab: Søking

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

Læringsmål og pensum. Algoritmeeffektivitet

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

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

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

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

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

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

Hvor raskt klarer vi å sortere?

INF2220: Time 12 - Sortering

Datastrukturer for rask søking

Bruk piazza for å få rask hjelp til alles nytte!

Kap.8 Sortering og søking sist oppdatert 16.03

TDT4110 Informasjonsteknologi grunnkurs: Eksempler. Mangekanter

Algoritmer - definisjon

Ta kontakt i pausen. Viktig at vi kommer i gang med dette arbeidet!

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab

Algoritmer - definisjon

INF1010 notat: Binærsøking og quicksort

Læringsmål og pensum

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

Løsningsforslag for utvalgte oppgaver fra kapittel 3

Filbehandling Tekstfiler

Logaritmiske sorteringsalgoritmer

Hva er en algoritme? Har allerede sett på mange algoritmer til nå i IT1101. Forholdet mellom en algoritme og et program. Algoritme program prosess

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Norsk informatikkolympiade runde

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

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Pensum: Starting out with Python

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

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

Algoritmer og Datastrukturer IAI 21899

Kapittel 8: Sortering og søking

Noen innebygde funksjoner - Vektorisering

Noen innebygde funksjoner - Vektorisering

Rekursjon. Binærsøk. Hanois tårn.

TDT4105 Informasjonsteknologi, grunnkurs. Matlab 5: Løkker (FOR og WHILE) Matlab 6: Problemløsning / Algoritmer

Eksamensforelesning TDT4105

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

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Introduksjon til Algoritmeanalyse

Algoritmer og Datastrukturer

TDT4105 Informasjonsteknologi grunnkurs: Uke 42 Strenger og strenghåndtering

Største primtallsfaktor i tall

Kapittel 9: Sortering og søking Kort versjon

Divide-and-Conquer. Lars Vidar Magnusson

TDT4105 Informasjonsteknologi, grunnkurs. Matlab 5: Løkker (FOR og WHILE) Matlab 6: Problemløsning / Algoritmer

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

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

Quicksort. Fra idé til algoritme.

Algoritmeanalyse. (og litt om datastrukturer)

MAT1030 Plenumsregning 1

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

Innhold. Innledning 1

Rekursiv programmering

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Kapittel 9: Sortering og søking Kort versjon

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

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

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Oppsummering fra sist

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Øvingsforelesning 7 i Python (TDT4110)

MAT1030 Diskret Matematikk

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Datastrukturer (kap. 8)

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Løsningsforslag for eksamen i fag TDT4120 Algoritmer og datastrukturer Tirsdag 9. desember 2003, kl

Grunnleggende Grafteori

TDT4110 IT Grunnkurs Høst 2012

Rekursiv programmering

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

Algoritmer Teoribok: Algorithms Kap 5 fra Brookshear & Brylow: Computer Science: An Overview

NIO 1. runde eksempeloppgaver

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

TDT4105 Informasjonsteknologi, grunnkurs

Forelesning 30: Kompleksitetsteori

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

LO118D Forelesning 12 (DM)

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

UNIVERSITETET I OSLO

MAT1030 Diskret matematikk

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

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

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

EKSAMEN med løsningsforslag

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Læringsmål og pensum. Oversikt

MAT1030 Diskret matematikk

Transkript:

1 TDT4105 Informasjonsteknologi, grunnkurs Matlab: Sortering og søking Kunnskap for en bedre verden Amanuensis Terje Rydland Kontor: ITV-021 i IT-bygget vest (Gløshaugen) Epost: terjery@idi.ntnu.no Tlf: 735 91845 TDT4105 IT G 1 uke-46-matlab-13 9. november 2015 2 Palindrom - iterativt Def: Tekststreng som kan leses likt begge veier Otto, Radar, Agnes i senga, Test flanke-tegnene Ulike: Ikke et palindrom Like: Sjekk om teksten uten flanke-tegnene er et palindrom Pseudokode Finn lengden av teksten Gjør om teksten til små bokstaver Så lenge det er bokstaver igjen eller endebokstaver ikke er like sammenlign første og siste bokstav hvis de er like ferdig sammenlign første og siste bokstav fjern første og siste bokstav 2 uke-46-matlab-13 9. november 2015

3 Palindrom - iterativt function palindrom = ispalindrome(ord) ordlengde = length(ord); %finner lengden av ordet ord = lower(ord); %gjør om til bare små bokstaver palindrom = false; %intialiserer returvariabelen start = 1; slutt = ordlengde; ferdig = false; %initialiserer stoppkriteriet while ~ferdig if ord(start) ~= ord(slutt) %sammenligner bokstaver ferdig = true; else start = start+1; %hvis bokstavene var like må vi slutt = slutt-1; %plukke ut to nye bokstaver if start > slutt ferdig = true; palindrom = true; end %if end %if end %while end %function 3 uke-46-matlab-13 9. november 2015 4 Palindrom - rekursivt Def: Tekststreng som kan leses likt begge veier Otto, Radar, Agnes i senga, Stopptilfelle: 0 eller 1 tegn er et palindrom Test flanke-tegnene Ulike: Ikke et palindrom Like: Sjekk om teksten uten flanke-tegnene er et palindrom 4 uke-46-matlab-13 9. november 2015

5 palindrom.m function p = palindrom(tekst) % sjekker om tekst er et palindrom (leses likt begge veier) lengde = length(tekst); if lengde < 2 p = true; elseif lower(tekst(1)) == lower(tekst(lengde)) p = palindrom( tekst(2:lengde-1) ); else p = false; end end % function Bruker lower-funksjonen for å gjøre tegnsammenligningene uavhengig av små/store bokstaver, slik at f. eks. RADar blir et palindrom 5 uke-46-matlab-13 9. november 2015 6 O-notasjon og kompleksitet Ønsker et mål på hvor lang tid en algoritme bruker på å kjøre som en funksjon av mengde inndata, N Vi teller enkle oppgaver som antall sammenligninger, antall ombyttinger, regneoperasjoner og lignende som en funksjon av N Nøyaktig tid avhenger av programmering, språk og datamaskin Ønsker et estimat for økningen av kjøretid i forhold til problemstørrelse 6 uke-46-matlab-13 9. november 2015

7 Kompleksitet N log(n) N*log(N) log2(n) N*log2(N) N 2 2 N 10 1 10 3 33 100 1024 100 2 200 7 664 10000 1,26765E+30 1000 3 3000 10 9966 1000000 1,0715E+301 10000 4 40000 13 132877 100000000 "Mye" 100000 5 500000 17 1660964 10000000000 "Mye" 1000000 6 6000000 20 19931569 1E+12 "Mye" 10000000 7 70000000 23 232534967 1E+14 "Mye" 100000000 8 800000000 27 2657542476 1E+16 "Mye" 1000000000 9 9000000000 30 3,E+10 1E+18 "Mye" n n 2 2 n log(n) n*log(n) log2(n) n*log2(n) 7 uke-46-matlab-13 9. november 2015 8 Sortering og søking Kanskje det datamaskiner brukes aller mest til eks: Google Ikke forbeholdt datatekniske fag Kommer inn i mange teknologiske og naturvitenskapelige anvendelser Sentrale bygge-klosser å kjenne til. 8 uke-46-matlab-13 9. november 2015

9 Pensum Matlab-boka: 12.3 og 12.5 Stoffet oppfattes ofte som forholdsvis vanskelig Eksamensrelevant Du må prøve ting selv Video for å visualisere det som foregår 9 uke-46-matlab-13 9. november 2015 10 Læringsmål Forstå prinsipper for søking i sorterte vs. tilfeldige (ikke-sortere) datamengder Kunne programmere søking fra grunnen av Kunne skrive et program for sortering ut fra en algoritme eller oppgitt pseudokode Betydningen av en algoritmes kompleksitet og O-notasjon. 10 uke-46-matlab-13 9. november 2015

11 Sortering Sortering er et stort delområde innen datateknikken Matlab har en innebygd funksjon sort() Skal lære noen enkle sorteringsalgoritmer Se wikipedia.org (sorteringsalgoritmer) for en oversikt over sorteringsalgoritmer og deres egenskaper 11 uke-46-matlab-13 9. november 2015 12 Antall operasjoner for å sortere data En ideell sorteringsalgoritme er O(N). De beste sorteringsalgoritmene basert på å sammenligne to og to elementer er O(N * logn) De enkleste sorteringsalgoritmene er O(N 2 ) Hvorfor vil man ikke bruke O(N 2 )-algoritmer for å sortere store datamengder? n n 2 log(n) n*log(n) log2(n) n*log2(n) 12 uke-46-matlab-13 9. november 2015

13 Enkle sorteringsalgoritmer Utvelgelsessortering (selection sort) Finner det minste gjenværende elementet i hver runde Boblesortering (bubble sort) Sammenligner nabo-elementer Bytter om ved feil rekkefølge Beveger seg mot sortert rekkefølge, minst ett tall kommer på plass i hver runde. Sortering ved innsetting (insertion sort) Som i kortspill Setter inn i sortert delmengde som begynner med ett element og vokser til alle. 13 uke-46-matlab-13 9. november 2015 14 14 uke-46-matlab-13 9. november 2015

15 Input: Output: Pseudokode for sortering ved innsetting Ikke-tom liste med tall, L Sortert liste L Foreach index i = 2:lengthof(L) do j = i while (j > 1) og ( L(j-1) > L(j) ) bytt om L(j-1) og L(j) j = j-1 end end 15 uke-46-matlab-13 9. november 2015 16 innsettingssortering.m function liste = innsettingssortering(liste) for i = 2:length(liste) %setter nr. i inn i sortert del j = i; while (j > 1) && (liste(j-1) > liste(j)) % Bytter om elementene tmp = liste(j-1); liste(j-1) = liste(j); liste(j) = tmp; j = j 1; end %while end %for end %function 16 uke-46-matlab-13 9. november 2015

17 Merknader Ikke egnet for store datamengder O(N 2 ) Bruker ikke ekstra lagerplass (ekstra tabeller) Hvordan blir det hvis vi ønsker synkende sortering? 17 uke-46-matlab-13 9. november 2015 18 Fletting av sorterte lister To sorterte lister kan enkelt flettes til en sortert liste 2 15 33 40 7 8 30 45 99 2 7 8 15 30 33 40 45 99 Plukker det minste gjenværende elementet i hvert trinn Når en liste er tom, er det bare å legge til det som er igjen av den andre. 18 uke-46-matlab-13 9. november 2015

19 flettlister.m function l = flettlister(a,b) %Fletter 2 sorterte lister a_lengde = length(a); b_lengde = length(b); a_neste = 1; % indekser til neste element i listene b_neste = 1; l_neste = 1; while (a_neste <= a_lengde) && (b_neste <= b_lengde) if a(a_neste) <= b(b_neste) % henter fra a l(l_neste) = a(a_neste); a_neste = a_neste + 1; else % henter fra b l(l_neste) = b(b_neste); b_neste = b_neste + 1; end %if l_neste = l_neste + 1; end %while if a_neste > a_lengde % a er tom. Legg inn resten av b for j = b_neste:b_lengde l(l_neste) = b(j); l_neste = l_neste + 1; end %for else % b er tom. Legg inn resten av a for j = a_neste:a_lengde l(l_neste) = a(j); l_neste = l_neste + 1; end %for end % if end %function 19 uke-46-matlab-13 9. november 2015 20 Sortering ved fletting Deler listen i to, sorterer halvpartene, fletter dem sammen Rekursivt Stopper når en liste har ett element (sortert!) O(NlogN) 20 uke-46-matlab-13 9. november 2015

21 flettesortering.m function sortert = flettesortering(liste) % Sorterer liste med rekursiv flettesortering lengde = length(liste); if lengde <= 1 sortert = liste; else median = floor(lengde/2); sortert = flettlister(flettesortering(liste(1:median)),... flettesortering(liste(median+1:lengde))); end %if end %function 21 uke-46-matlab-13 9. november 2015 22 Kalltre flettesortering [15 8 13 3 7 14] [3 7 8 13 14 15] [8 13 15] liste [15 8 13 3 7 14] lengde = 6 median = 3 1 6 [3 7 14] [15] liste [15] lengde = 1 liste [15 8 13] lengde = 3 median = 1 2 [8] liste [8] lengde = 1 3 [8 13] liste [8 13] lengde = 2 median = 1 4 5 [13] liste [13] lengde = 1 [3] liste [3] lengde = 1 liste [3 7 14] lengde = 3 median = 1 7 8 liste [7] lengde = 1 [7 14] liste [7 14] lengde = 2 median = 1 [7] 9 10 [14] liste [14] lengde = 1 22 uke-46-matlab-13 9. november 2015

23 Merknader Noen ulemper med rekursjon. Et funksjonskall er relativt kostbart. Går med minne til lokale variabler for hver gang funksjonen kalles. Kan vi gjøre flettesorteringen mer effektiv? Gå over til sortering ved innsetting når listene er korte nok. I tabellen på neste lysark: F/5 flettesortering med overgang når listelengde <= 5 F/100 - <= 100 Osv. 23 uke-46-matlab-13 9. november 2015 24 Kjøretider 24 uke-46-matlab-13 9. november 2015

25 Søkealgoritmer En søkealgoritme er en algoritme som søker gjennom en datamengde, på jakt etter en bestemt verdi. Vi skal begrense oss til det enkleste, søking i lister Vi skal se på to typer søk: Sekvensielt søk Binærsøk 25 uke-46-matlab-13 9. november 2015 26 Sekvensielt søk Går gjennom alle dataelementene fra begynnelse til slutt Tidkrevende, må gå gjennom alle elementene Fordringsløs krever ikke noen forhåndsinformasjon om datamengden Eksempel: Finne ut om et telefonnr finnes i telefonkatalogen 26 uke-46-matlab-13 9. november 2015

27 finnestall.m function funnet = finnestall(liste, tall) % Returnerer true hvis tall finnes i liste, false ellers % Sekvensiell søkning funnet = false; for i = 1:length(liste) if liste(i) == tall funnet = true; return end %if end %for end % function 27 uke-46-matlab-13 9. november 2015 28 Varianter Finne antall forekomster at tallet i listen Finne første indeks (posisjon) til tall i listen Finne alle indeksene til tall i listen Prøv gjerne å programmere disse selv! Sekvensielt søk er så langsomme at man søker alternativer: Sortering og så søking Søketrær (indekser) 28 uke-46-matlab-13 9. november 2015

29 Binærsøking Hvis datamengden er sortert (ordnet) kan søket gjøres mye mer effektivt Sjekker midterste element i datamengden Elementet er der -> ferdig Fortsetter å lete i den relevante halvparten Arbeidsmengde Antall halveringer ca log 2 (N) Sekvensiell søking: ca N. Stor forskjell når N er stor 29 uke-46-matlab-13 9. november 2015 30 Koding av binærsøk Koder b_finnestall(liste, tall) med binærsøking Forutsetter at liste er sortert stigende Bruker l(ow) og h(igh) for å avgrense et mindre og mindre område der tall kan finnes Regner ut elementet midt i dette området median = floor( (l+h)/2 ) Husk at floor runder nedover til nærmeste heltall 30 uke-46-matlab-13 9. november 2015

31 b_finnestall(liste,tall) function funnet = b_finnestall(liste,tall) % Returnerer true hvis tall finnes i liste, false ellers % Bruke binærsøk, lista antas å være sortert stigende l = 1; % Minste indeks h = length(liste); % Største indeks while l <= h % Finner midtpunkt median = floor((l+h)/2); if liste(median) == tall l = h+1; % Tall er funnet. Dette avslutter løkken elseif liste(median) < tall % Må lete i øvre halvdel l = median + 1; else % Må lete i nedre halvdel h = median 1; end %if end % while % Setter returverdi funnet = liste(median) == tall; end % function 31 uke-46-matlab-13 9. november 2015 32 b_finnestall(minliste, 8) - programsporing Steg liste tall l h median funnet 1 [1 8 16 23 30] 8 - - - - 2 1 - - - 3 5 - - 4 3-5 2-6 1-7 2-8 2-9 3-10 true 32 uke-46-matlab-13 9. november 2015

33 b_finnestall(minliste, 10) - programsporing Steg liste tall l h median funnet 1 [1 8 16 23 30] 10 - - - - 2 1 - - - 3 5 - - 4 3-5 2-6 1-7 2-8 2-9 3-10 false 33 uke-46-matlab-13 9. november 2015 34 Binærsøking rekursivt function funnet = binaersoek(liste, verdi, lavindeks, hoyindeks) % Rekursivt binærsøk etter verdi i liste midten = floor((hoyindeks + lavindeks)/2); if lavindeks > hoyindeks funnet = false; elseif verdi == liste(midten) funnet = true; elseif verdi < liste(midten) funnet = binaersoek(liste, verdi, lavindeks, midten 1); else funnet = binaersoek(liste, verdi, midten + 1, hoyindeks); end % if end % function 34 uke-46-matlab-13 9. november 2015

35 Binærsøking rekursivt graf Søk etter 13 Søk etter 6 liste [3 7 8 13 14 15] verdi 13 lav 1 høy 6 midt 3 liste [3 7 8 13 14 15] verdi 6 lav 1 høy 6 midt 3 return true return false liste [3 7 8 13 14 15] verdi 13 lav 4 høy 6 midt 5 liste [3 7 8 13 14 15] verdi 6 lav 1 høy 2 midt 1 return true return false liste [3 7 8 13 14 15] verdi 13 lav 4 høy 4 midt 4 liste [3 7 8 13 14 15] verdi 6 lav 2 høy 2 midt 2 35 uke-46-matlab-13 9. november 2015 36 Sekvensiell søking vokser med N Kompleksitet for søking n Kjøretiden vil bli k 1 *N + k 0 For stor N dominerer k 1 *N Vi sier at algoritmen er O(N) Vokser N, øker kjøretiden proporsjonalt med N Binærsøking gjør log 2 (N) sammenligninger Kjøretiden vil bli k 1 *log 2 (N) + k 0 = k*log(n) + k 0 Vokser N, øker kjøretiden proporsjonalt med log(n) Vi sier at algoritmen er O(log(N)) log(n) n*log(n) log2(n) n*log2(n) 36 uke-46-matlab-13 9. november 2015