Datastrukturer for rask søking

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

Definisjon av binært søketre

Hvor raskt klarer vi å sortere?

Binære trær: Noen algoritmer og anvendelser

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Definisjon: Et sortert tre

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

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

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

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

Logaritmiske sorteringsalgoritmer

Hashing: Håndtering av kollisjoner

Kap.8 Sortering og søking sist oppdatert 16.03

Liste som abstrakt konsept/datatype

Et eksempel: Åtterspillet

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

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

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

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

PG4200 Algoritmer og datastrukturer Forelesning 7

INF2220: Forelesning 2

Et eksempel: Åtterspillet

INF Algoritmer og datastrukturer

Vi skal se på grafalgoritmer for:

TDT4105 Informasjonsteknologi, grunnkurs

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

INF1010 notat: Binærsøking og quicksort

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

Vi skal se på grafalgoritmer for:

Pensum: fra boken (H-03)+ forelesninger

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

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

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

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Selv-balanserende søketrær

Pensum: fra boken (H-03)+ forelesninger

Innhold. Innledning 1

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

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

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

INF2220: Time 12 - Sortering

Obligatorisk oppgave 1 INF1020 h2005

Algoritmer og Datastrukturer

INF Algoritmer og datastrukturer

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

INF2220: Forelesning 2

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

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

MED TIDESTIMATER Løsningsforslag

Lars Vidar Magnusson

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

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

PG 4200 Algoritmer og datastrukturer Innlevering 2

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Palindrom - iterativt

Grafalgoritmer: Korteste vei

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

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Algoritmeanalyse. (og litt om datastrukturer)

IN Algoritmer og datastrukturer

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

INF2220: Forelesning 3

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

INF Algoritmer og datastrukturer

O-notasjon og kompleksitet

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Backtracking som løsningsmetode

INF Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 10

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Læringsmål og pensum. Algoritmeeffektivitet

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

UNIVERSITETET I OSLO

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

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

Ordliste. Obligatorisk oppgave 1 - Inf 1020

O(log n) - søk. Søking i et balansert søketre med n elementer er alltid O(log n) Søkingen er basert på parvise sammenligninger av to og to verdier

UNIVERSITETET I OSLO

Grunnleggende Datastrukturer

UNIVERSITETET I OSLO

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

INF2220: Time 4 - Heap, Huffmann

Algoritmer og Datastrukturer IAI 21899

Notater til INF2220 Eksamen

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

Transkript:

Søking

Søkeproblemet Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke? Effektiviteten til søkealgoritmer avhenger av: Om datastrukturen er sortert/ordnet eller ikke Om datastrukturen er designet/bygget opp slik at den kan utnyttes til å gjøre raske søk Hvor smart selve algoritmen er Noen ganger også av selve dataene/verdiene som er lagret i datastrukturen

Datastrukturer for rask søking I alg.dat. kurset skal vi (senere) se på: Binære søketrær Heap/ prioritetskøer Multivei søketrær/ B-trær Hashtabeller I denne delen om søking holder vi oss til: Usorterte arrayer Sorterte arrayer

Hvor raskt klarer vi å søke? Må alltid gjøre minst ett oppslag i datastrukturen bare for å se om x finnes der Hvis vi ikke har noe informasjon om dataene som kan brukes til å effektivisere søket: O(n) Hvis dataene er sorterte: O(log n) og enda raskere med triksete algoritmer Hvis vi vet mer om dataene og lagrer dem i en smart datastrukturer (som f.eks en hashtabell) kan søking (under visse forutsetninger) være helt ned i O(1)

Søking i arrayer forenkling Læreboka bruker generiske metoder i Java som kan søke i arrayer som inneholder alt, så lenge dataene er Comparable For å fokusere på algoritmene og effektiviteten, og ikke på Java, forenkler vi søkeproblemet til: Arrayer som bare innholder heltall Boolske metoder som søker etter et tall x i en array, og som returnerer: true hvis x finnes i arrayen false ellers

Sekvensielt (eller lineært) søk Hvis en datastruktur ikke er sortert/ordnet, og vi ikke har noe ekstra informasjon om dataene som kan utnyttes, er sekvensielt søk det beste vi klarer å få til Starter med første element og søker etter x, et og et element om gangen, inntil vi enten finner x eller har gått gjennom alle n elementer: O(n) Kan implementeres for alle datastrukturer som tilbyr en standard iterator for å gå gjennom alle elementer Se Java-koden

Søking i sorterte arrayer Sekvensielt søk er dumt : Vi spør hvert element om det er lik x Jfr. gjetteleken 20 spørsmål Hvis vi vet noe mer om dataene, kan dette ofte utnyttes til å lage mye raskere algoritmer Noen søkealgoritmer for sorterte arrayer: Binærsøk Ternært søk (oppgave) Interpolasjonssøk

Binærsøk i (stigende) sortert array Sammenligner verdien x vi søker etter med elementet midt i arrayen Hvis x er lik midtre element er søket ferdig Hvis x er mindre enn midtre element søker vi videre på samme måte i nedre halvdel av array Hvis x er større enn midtre element søker vi videre på samme måte i øvre halvdel av array Binærsøk bruker smarte spørsmål : Vi kvitter oss med halvparten av de mulige gjenværende elementene i hvert steg

Binærsøk: Eksempel, x = 22, n = 17 2 6 10 14 22 27 28 29 35 40 50 63 77 82 88 93 99 2 6 10 14 22 27 28 29 35 40 50 63 77 82 88 93 99 2 6 10 14 22 27 28 29 35 40 50 63 77 82 88 93 99 2 6 10 14 22 27 28 29 35 40 50 63 77 82 88 93 99

Binærsøk: Effektivitet og implementasjon Effektivitet for array av lengde n: Worst case: Elementet vi søker finnes ikke i arrayen Antall steg er lik antall ganger n er delelig med 2 Konklusjon: Binærsøk er O(log n) supereffektivt Implementasjon: Iterativt: Med en løkke der vi hele tiden oppdaterer nedre, øvre og midtre indeks for den delen av arrayen der søkt element kan befinne seg Rekursivt: Enklere kode, mindre effektivt (oppgave) Se Java-koden

Litt smartere: Interpolasjonssøk Eksempel: Leter etter B, i en telefon-katalog fra A-Å på papir Binærsøk: Åpner katalogen på midten, deretter på 1/4 av sidene etc. Menneskelig søk : Åpner katalogen omtrent der vi tror B befinner seg Interpolasjonssøk: Prøver å beregne hvor søkt element ligger

Interpolasjonssøk: Eksempel A sortert array med heltall, n = 50, x = 180 A[0] = 101, A[49] = 200 Hvis tallene i A er noenlunde jevnt fordelt, er det rimelig å anta at verdien 180 ligger i nærheten av 80% av lengden på arrayen: (180 101 + 1) / (200-101 + 1) = 0.8 I stedet for å dele A i to like store halvdeler, deler vi i den indeksen der vi antar at 180 ligger: (50 0.8) - 1 = 40-1 = 39 Fortsetter å dele på samme måte inntil ferdig Se Java-kode

Binærsøk vs. interpolasjonssøk Binærsøk: Deler alltid i to like store deler, alltid O(log n) Interpolasjonssøk: Deler også i to deler, men alltid på det stedet der vi forventer at søkt element ligger, hvis verdiene er noenlunde jevnt fordelt Kan bevises: O(log(log n)) hvis jevn fordeling av verdier Sammenligning, n = 1 000 000 Binærsøk: O(log n) 20 Interpolasjonssøk: O(log(log n)) 4 Se testprogram for sammenligning av søkealgoritmer

Arrayer som datastruktur Usortert array: Innsetting: O(1) Fjerning: O(n) Søking: O(n) OK for små datamengder Sortert array Innsetting: O(n) Fjerning: O(n) Søking: O(log n) OK for statiske datasett uten mye fjerning og innsetting For generelle problemer med mye data må vi bruke datastrukturer som er raskere (O(log n) eller bedre) for søking, fjerning og innsetting