260 likes | 461 Views
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.
E N D
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
Algoritmer Algoritme = oppskrift / fremgangsmåte for å løse en oppgave • 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
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 Max-størrelsen er 3 (4 elementer) Tallet 45 ligger på index 1 0 1 2 3
A0 A0+3 A0+6 Elem0 Elem1 Elem2 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: A0Element 1: A0+3Element 2: A0+6osv…når A0 er der første celle i tabellen ligger
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
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.html oppgave1.jsp
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 Oppgave2: Tenk ut en smartere algoritme for å søke etter et angitt lag i den sorterte listen
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.html oppgave2.jsp
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
Avansert algoritme for søking (sortert liste) Tenk ut en ”smartere” algoritme som bruker mindre tid for å søke etter et angitt lag i listen. • Aalesund • Brann • Haugesund • Hønefoss • Kongsvinger • Lillestrøm • Molde • ... • Tips: hva gjør vi når vi slår opp i telefonkatalogen?
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
Binært søk: illustrasjon Halverer liste hele tiden – enten over eller under:
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
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?
Løsning til sekvensielt søk • Sortert: • 200 sammenligninger i verste fall. Men kan ofte være mindre enn 200. • Usortert: 200 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 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
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
Kjøretidskompleksitet Kjøretiden proporsjonal med • (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
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)
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
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
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!
Første gang: Vålerenga Start Lyn Lillestrøm Viktig Brann Odd Grenland Rosenborg Tromsø Ham-Kam Molde Fredrikstad Aalesund Bodø/Glimt Bytt om: Start Vålerenga Lyn Lillestrøm Viktig Brann Odd Grenland Rosenborg Tromsø Ham-Kam Molde Fredrikstad Aalesund Bodø/Glimt Andre gang: Start Vålerenga Lyn Lillestrøm Viktig Brann Odd Grenland Rosenborg Tromsø Ham-Kam Molde Fredrikstad Aalesund Bodø/Glimt Bytt om: Start Lyn Vålerenga Lillestrøm Viktig Brann Odd Grenland Rosenborg Tromsø Ham-Kam Molde Fredrikstad Aalesund Bodø/Glimt Bytt om: Lyn Start Vålerenga Lillestrøm Viktig Brann Odd Grenland Rosenborg Tromsø Ham-Kam Molde Fredrikstad Aalesund Bodø/Glimt Sortering ved innsetting • Sortering ved å flytte internt • Starter på andre element og sjekker første • Fortsetter nedover lista og sjekker/bytter alle ovenfor oppgave4.jsp
Talleksempel = sortert usortert utg.pkt 1. steg Stadig større del av tabellen blir sortert! 2. steg Ferdig
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