Søgning og Sortering Philip Bille
Plan Søgning Linæer søgning Binær søgning Sortering Indsættelsesortering Flettesortering
Søgning
Søgning 1 4 7 12 16 18 25 28 31 33 36 42 45 47 50 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 En tabel A[1..n] er sorteret (i ikke-faldende rækkefølge) hvis A[1] A[2] A[n] Søgningsproblemet: Givet en sorteret tabel A og et tal x, afgør om der findes indgang i, så A[i] = x.
Lineær søgning 1 4 7 12 16 18 25 28 31 33 36 42 45 47 50 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Undersøg for alle indgange A[i] om A[i] = x. Tid: Θ(n)
Binær søgning Kig på midterste indgang m i A. A[m] = x: færdig A[m] < x: fortsæt rekursivt på højre halvdel. A[m] > x: fortsæt rekursivt på venstre halvdel. Stopper når tabellen har størrelse 1
Analyse Hvor hurtigt kører den? Analog til analyse af rekursiv toppunktsalgoritme. Et rekursivt kald tager konstant tid. I hver rekursion halverer vi tabellen vi kigger på. Vi stopper når tabellen har størrelse 1. Køretiden er Θ(log n)
Alternativ analyse Lad T(n) være køretiden for binær søgning. Opskriv og udregn rekursionsligningen for T(n). T (n) = ( T (n/2) + c hvis n>1 d hvis n =1
T (n) = ( T (n/2) + c hvis n>1 d hvis n =1 T (n) =T = T = T n 2 n 4 n 8 + c + c + c + c + c + c. n = T 2 k + ck. n = T 2 log 2 n + c log 2 n = T (1) + c log 2 n = d + c log 2 n = (log n)
Søgning Lineær søgning løser søgningsproblemet i Θ(n) tid. Binær søgning løser søgningsproblemet i Θ(log n) tid.
Sortering
Sortering 33 4 25 28 45 18 7 12 36 1 47 42 50 16 31 1 4 7 12 16 18 25 28 31 33 36 42 45 47 50 Sorteringsproblemet: Givet en tabel A[1..n] returner en tabel B[1..n] med samme indhold som A men i sorteret orden.
Anvendelser Oplagte: Sortere en liste af navne, organisere et MP3 bibliotek, vise Google PageRank resultater, vise Facebook feed i kronologisk rækkefølge. Ikke oplagte: Datakompression, computergrafik, bioinformatik, anbefalingssystemer (film på Netflix, bøger på Amazon, reklamer på Google,..). Nemme problemer for sorteret data: Binær søgning, find median, identificer duplikater, find tætteste par, find statiske perifere observationer (outliers).
Indsættelsessortering (insertion-sort) Start med en ikke sorteret tabel. Kig på indgangene fra venstre til højre. Ved indgang i: Indsæt A[i] i rækkefølge blandt deltabellen A[1..i-1]. For at finde rette sted sammenligner vi med indgangene fra højre til venstre.
Korrekthed Hvorfor virker det? Før iteration i består deltabellen A[1..i-1] af de tal der oprindeligt var i A[1..i-1] i sorteret rækkefølge. Iteration i indsætter A[i] i deltabellen A[1..i-1] Efter iteration i består deltabellen A[1..i] af de tal der oprindeligt var i A[1..i]
Analyse Hvor hurtigt kører den? Hvor lang tid tager det at indsætte A[i] i korrekt position? Samlet tid = Θ(tid for at indsætte alle indgangene i korrekt position)
Analyse Indsættelsessortering kører i Θ(n 2 ) tid.
Flettesortering (mergesort) Hurtigere sorteringsalgoritme. Ide: Rekursiv sortering vha. fletning af sorterede deltabeller.
Fletning (merge) Mål. Kombiner to sorterede tabeller til én sorteret tabel i lineær tid Ide: Hold styr på mindste element i hver sorteret tabel. Indsæt mindste af de to elementer i en ekstra tabel. Gentag indtil færdig.
Analyse Hvert skridt i algoritmen tager Θ(1) tid. I hvert skridt flytter vi en indgang frem i en af tabellerne. Linæer tid i sum af længde af tabellerne.
Flettesortering Del A i to halvdele. Sorter hver halvdel rekursivt. Flet de to halvdele sammen. Stop når tabel har størrelse 1
33 4 25 28 45 18 7 12 4 7 12 18 25 28 33 45 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
33 4 25 28 45 18 7 12 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
33 4 25 28 45 18 7 12 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
33 4 25 28 45 18 7 12 4 7 12 18 25 28 33 45 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
33 4 25 28 45 18 7 12 4 7 12 18 25 28 33 45 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
Analyse Lad T(n) være køretiden af flettesortering. Hvor hurtigt kører den? Ide: T(n) = Θ(total tid brugt på fletning) Fletning tager lineær tid. T(n) = Θ(total længde af tabeller over alle rekursive kald)
33 4 25 28 45 18 7 12 4 7 12 18 25 28 33 45 33 4 25 28 45 18 7 12 4 25 28 33 7 12 18 45 33 4 25 28 45 18 7 12 4 33 25 28 18 45 7 12 33 4 25 28 45 18 7 12
Analyse Flettesorting kører i Θ(nlog n) tid.
Del og hersk (divide-and-conquer) Flettesortering er eksempel på en del-og-hersk algoritme. Del-og-hersk: algoritmisk designparadigme Del: Opdel problemet i et eller flere delproblemer Hersk: Løs delproblemerne rekursivt Kombiner: Sæt løsningerne til delproblemerne sammen til en samlet løsning for problemet. Flettesortering: Del: Del A i to halvdele. Hersk: Sorter hver halvdel rekursivt. Kombiner: Flet de to halvdele sammen.
Sortering Indsættelsessortering i Θ(n 2 ) tid. Flettesortering i Θ(nlog n) tid. Fletning i Θ(n) tid.
Opsummering Søgning Linæer søgning Binær søgning Sortering Indsættelsesortering Flettesortering