tdt4110 informasjonsteknologi grunnkurs: algoritmer for søk og sortering
DESCRIPTION
TDT4110 Informasjonsteknologi grunnkurs: Algoritmer for søk og sortering Førsteamanuensis Alf Inge Wang. TDT4110 Informasjonsteknologi grunnkurs:. Læringsmål og pensum. Læringsmål: Lære om tabellstrukturer Lære algoritmer for søk og sortering av data Pensum: Læreboka 12.1-12.3. - PowerPoint PPT PresentationTRANSCRIPT
1
TDT4110 Informasjonsteknologi grunnkurs:
Algoritmer for søk og sortering
Førsteamanuensis Alf Inge Wang
TDT4110 Informasjonsteknologi grunnkurs:
2
Læringsmål og pensum
• Læringsmål: – Lære om tabellstrukturer– Lære algoritmer for søk og sortering av data
• Pensum:– Læreboka 12.1-12.3
3
Algoritme = oppskrift / fremgangsmåte for å løse en oppgaveAlgoritmer
• Definisjon av algoritmer i boka (11.1.2 s.431 tidligere utgaver):– ”En sekvens av utvetydige, utførbare skritt som leder til en
løsning av et gitt problem.”
• Vi har allerede sett på mange algoritmer– Algoritme for å summere en tabell– Algoritme for å finne gjennomsnitt i en tabell– Med flere
– I dag skal vi se på algoritmer for søking og sortering
4
Først litt om tabeller
• Kan som kjent lagre flere verdier (tekst, tall, sannhetsverdier) i en tabell
• Tabellen har en maxstørrelse og index som angir plassnummer i tabellen
34 45 67 78
0 1 2 3
Tallet 45 ligger på index 1
Max-størrelsen er 3 (4 elementer)
5
Tabeller lagret i minne
• Elementene i en tabell lagres etter hverandre i primærminnet
• Hvis hvert element tar 3 minneplasser og tabellen har 4 celler blir adressen til:Element 0: A0
Element 1: A0+3Element 2: A0+6osv…når A0 er der første celle i tabellen ligger
Elem2Elem1Elem0
A0 A0+3 A0+6
6
Tabeller i minne (generelt)
• Plasseringen i minnet for en tilfeldig indexplass (i) når hver har en fast størrelse (S) og første celle ligger på plass A0 blir:
• Adresse til element i = A0 + i * S
• Dette betyr: Når vi har data i en tabell kan vi aksessere hvilket som helst element direkte– Siden vi kan beregne adressen internt i minne– Tar like lang/kort tid uansett
7
Enkel algoritme for søking (usortert liste)• Anta at følgende lag ligger etter hverandre i en tabellen lag[14]:
– Vålerenga– Start– Tromsø– Lillestrøm– Viking– Brann– Odd Grenland– Rosenborg– ...
• Når vi søker etter noe kan vi få to utfall:– Suksess: ”XXX ligger på plass nummer Y”– Fiasko: ”XXX befinner seg ikke i elitedivisjon”
Oppgave1: Tenk ut en algoritme for å søke etter et angitt lag i listen og finne posisjonen til
laget i tabellen.
oppgave1.htmloppgave1.jsp
8
Oppgave2: Tenk ut en smartere algoritme for å søke etter et
angitt lag i den sorterte listen
Enkel algoritme for søking (sortert liste)• Anta at følgende lagene ligger etter hverandre i en
liste:– Aalesund– Brann– Haugesund– Hønefoss– Kongsvinger– Lillestrøm– Molde– Odd Grenland– ...
• Algoritmen skal fortsatt gå steg for steg
9
Løsning på sortert liste
• Algoritmen kan undersøke underveis om vi har passert det stedet der verdien kunne ha befunnet seg i datamengden:– Eks: Søker etter ”Bryne” i elitedivisjonstabellen. Kan avslutte søket
etter har passert ”Brann”.• Kan bruke int streng1.compareTo(streng2)• Returnerer 0 hvis strenger er like• Returnerer negativt tall hvis streng1 har høyere leksikalsk verdi enn
streng2 (og motsatt)
oppgave2.htmloppgave2.jsp
10
Metoder for å håndtere store/små bokstaver i strenger• int compareToIgnoreCase(String str)
– Compares two strings lexicographically, ignoring case differences.
• String toLowerCase() – string.toLowerCase(); // Gjør om streng til små bokstaver
• String toUpperCase()
– string.toUpperCase(); // Gjør om streng til store bokstaver
11
Tenk ut en ”smartere” algoritme som bruker mindre tid for å søke
etter et angitt lag i listen.
Avansert algoritme for søking (sortert liste)
– Aalesund
– Brann
– Haugesund
– Hønefoss
– Kongsvinger
– Lillestrøm
– Molde
– ...
• Tips: hva gjør vi når vi slår opp i telefonkatalogen?
12
Binærsøk (forutsetter sortert tabell)• Går midt i tabellen, sjekker verdi mot det vi søker
etter• Sjekker videre i enten venstre eller høyre halvdel av
tabellen• Går midt i halvdelen som er igjen å sjekke• Halverer videre til vi finner det vi leter etter, eller det
ikke er flere elementer å sjekke
13
Binært søk: illustrasjon
Halverer liste hele tiden – enten over eller under:
14
Likt antall elementer i en liste (eller en subliste)• F.eks en liste med 6 elementer• Vi må bestemme oss for om vi runder ned
eller opp
15
Oppgave
• Gitt en tabell med 200 elementer. Hvor mange sammenligninger må vi gjøre ved søk etter noe som ikke ligger i tabellen?– Med sekvensiellt søk?
• Usortert
• Sortert
– Med binært søk?
16
Dersom vi søker etter Åberg vil søk i sortert
liste være tilnærmet like treg som i en usortert
Løsning til sekvensielt søk
• Sortert:– 200 sammenligninger i verste fall. Men kan ofte være mindre
enn 200.
• Usortert: 200
17
Løsning til binært søk• Binært søk: i verste fall 8 sammenligninger før vi kan være sikre
på at elementet ikke finnes i lista.• Vi får lister med størrelse:
– 200– 100 (100 eller 99 avh. av hva vi søker etter - i verste fall 100)– 50 (49 eller 50, i verste fall 50)– 25 (24 eller 25, i verste fall 25)– 12 (12 uansett)– 6 (5 eller 6, i verste fall 6)– 3 (2 eller 3, i verste fall 3)– 1 (1 uansett)
• Merk at vi må sjekke den siste lista med 1 element før vi kan være sikre på at elementet ikke eksisterer i lista
18
Antall sammenligninger ved binærsøk: Log2
• Rent generelt så kan man ta 2-logaritmen til lengden på lista og runde oppover.
• 2-logaritmen til et tall n er det tallet vi må opphøye 2 i for å få tallet n.
• Eller sagt på en annen måte: Hvor mange ganger må vi gange 2 med seg selv for å få (minst) n.
• 27=128 og 28=256
19
Kjøretiden proporsjonal
med
Kjøretidskompleksitet
• (n = lengde på lista)• Sekvensielt søk: n
• Binært søk: log2 n– log2 n = (ln n / ln 2)
• For mange av dere: Mer om dette i TDT4120 Algoritmer og datastrukturer
20
Oppgave (kunne vært gitt til eksamen)• Vil binærsøk alltid være raskere enn sekvensielt
søk? Forklar hvorfor/hvorfor ikke. (3 %)
• LF: Dersom det vi søker etter ligger tidlig i lista vil sekvensielt søk være raskere (færre sammenligninger må utføres). Generelt så vil binærsøk være raskere i de aller fleste tilfellene. Binærsøk er relativt sett raskere jo lengre lista er.
(Gitt sortert liste)
21
Algoritme for sortering av liste
• Anta at følgende lag ligger etter hverandre i en tabellen lag[14]:– Rosenborg– Vålerenga– Tromsø– Haugesund– Aalesund– Odd Grenland– Start– ...
• Utskrift til skjerm:– Utskrift av lag[] usortert– Utskrift av lag[] sortert
Oppgave3: Tenk ut en algoritme for å sortere lista
alfabetisk
22
Sortering ved å bytte plass (bobblesortering)• Traverser tabellen. Om to naboelementer står feil:
bytt plass• Traverser tabellen så mange ganger som det er
elementer i tabellen– I verste fall skal verdi i index 0 flyttes til index N (N=tabellens
lengde)
– Denne algoritmer er TREG!
oppgave3.jsp
23
Sortering ved innsetting
• Start på element 2, sørg for at de to første elementene er sortert ved å sette inn nr 2 riktig
• Gå til element 3, sørg for at de tre første elementene er sortert ved å sette inn nr 3 riktig
• Generelt: Gå til element N, sørg for at de N første elementene er sortert ved å sett inn nr N riktig
• Når hele lista er gått gjennom er hele lista sortert!
24
Sortering ved innsetting• Sortering ved å flytte internt• Starter på andre element og sjekker første• Fortsetter nedover lista og sjekker/bytter alle ovenfor
Første gang:1. Vålerenga2. Start3. Lyn4. Lillestrøm5. Viktig6. Brann7. Odd Grenland8. Rosenborg9. Tromsø10. Ham-Kam11. Molde12. Fredrikstad13. Aalesund14. Bodø/Glimt
Andre gang:1. Start2. Vålerenga3. Lyn4. Lillestrøm5. Viktig6. Brann7. Odd Grenland8. Rosenborg9. Tromsø10. Ham-Kam11. Molde12. Fredrikstad13. Aalesund14. Bodø/Glimt
Bytt om:1. Start2. Lyn3. Vålerenga4. Lillestrøm5. Viktig6. Brann7. Odd Grenland8. Rosenborg9. Tromsø10. Ham-Kam11. Molde12. Fredrikstad13. Aalesund14. Bodø/Glimt
Bytt om:1. Lyn2. Start3. Vålerenga4. Lillestrøm5. Viktig6. Brann7. Odd Grenland8. Rosenborg9. Tromsø10. Ham-Kam11. Molde12. Fredrikstad13. Aalesund14. Bodø/Glimt
Bytt om:1. Start2. Vålerenga3. Lyn4. Lillestrøm5. Viktig6. Brann7. Odd Grenland8. Rosenborg9. Tromsø10. Ham-Kam11. Molde12. Fredrikstad13. Aalesund14. Bodø/Glimt
oppgave4.jsp
25
Talleksempel
3 1 4 2
1 3 2 4
1 2 3 4
1 2 3 4Stadig større del av tabellen blir sortert!
usortert utg.pkt
1. steg
2. steg
Ferdig
= sortert
26
Oppsummering
• Les mer om disse algoritmene i boka kap 10/11 (kap 12 i tidligere utgaver av boka)
• Det finnes– Sekvensielle og– Binære søkealgoritmer– De binære er stort sett alltid mer effektive, men krever at
dataene er sorterte