Sökning och sortering Linda Mannila 27.11.2007
Denna föreläsning Sökningsalgoritmer Sorteringsalgoritmer Modulen time
Sökning Vanlig uppgift i datorsammanhang Exempel: Olika sökalgoritmer Hitta en viss person i ett register Söka efter ett telefonnummer I sorteringsalgoritmer (hitta max, hitta min) Olika sökalgoritmer Sekventiell (linjär) sökning Binärsökning
Sekventiell (linjär) sökning Linear search Går igenom alla element i en lista från början Jämför det aktuella elementet i listan med det vi söker efter Om det element vi tittar på är det vi söker har hittat elementet och kan sluta Annars gå framåt ett steg i listan, jämför med det vi söker efter etc. Om vi kommer till slutet av listan och inte har hittat elementet avsluta
Sekventiell sökning Fördelar? Nackdelar? Simpel Snabb om det eftersökta elementet finns i början av listan Nackdelar? Långsam om det eftersökta elementet inte finns i början av listan (kräver en massa jämförelser)
Binärsökning Binary search För sorterade datasamlingar Börjar med att titta på det mittersta elementet i en lista, jämför det med det vi söker efter Om det vi söker efter är mindre än det vi tittar på kan skippa högra delen av listan och upprepa processen på den vänstra halvan Om det vi söker är större än det vi tittar på skippa vänstra halvan Om det vi söker är det vi tittar på avsluta, vi har hittat vårt element
Binärsökning Sorted Array Compare X to the middle value of the array. If X=Y, (the middle element) we are done. If X < Y, we continue our search confine the search to first half only. If X > Y, we continue our search confine the search to second half.
Binärsökning Fördelar? Nackdelar? Snabb Kräver att data är sorterat... Men det kan lösas med en snabb sorteringsalgoritm, så i praktiken inget problem
Sökning linear_for.py linear_while.py binary.py
Tidtagning Modulen time >>> import time >>> dir(time) ['__doc__', '__name__', 'accept2dyear', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']
Exempel - time Kan användas för tidtagning # Returnerar info om den lokala tiden som en tupel >>> time.localtime() (2007, 11, 26, 17, 30, 16, 0, 330, 0) # Returnerar info om den lokala tiden som en sträng >>> time.asctime() 'Mon Nov 26 17:32:04 2007' # Returnerar info om Greenwich-tiden som en tupel >>> time.gmtime() (2007, 11, 26, 15, 30, 19, 0, 330, 0) # Returnerar processorns tid i sekunder >>> time.clock() 662.06464536693909 # Pausar exekveringen för så många sekunder som man # skickar som argument till funktionen >>> time.sleep(2) Kan användas för tidtagning
Exempel import time lista = range(100000) # t1 innehåller starttiden (i sekunder) t1 = time.clock() # Kör funktionen linear_search(lista, 750) # t2 innehåller sluttiden (i sekunder) t2 = time.clock() # Räknar ut exekveringstiden (i sekunder) exek_tid = t2-t1 # Skriver ut tiden (i sekunder och millisekunder) print "Exekveringen tog %0.4f sekunder" % exek_tid print "Exekveringen tog %0.4f millisekunder" % (exek_tid * 1000)
Sökning Exempel med tidtagning search.py search_avg.py Med lite avancerade features för den som är intresserad Illustrerar hur man kan skicka funktioner som argument till en annan funktion Krävs ej för kursen search_func_as_params.py search_func_as_params_nicer_output.py
Sortering Bubble sort Selection sort Insertion sort Merge sort Quicksort Rekursiva torsdagens tema
Bubble sort Enklaste sorteringsalgoritmen Tyvärr också den minst effektiva Grundidén är att gå igenom en lista med element upprepade gånger, se på två närliggande element åt gången och byta plats på dem ifall de kommer i fel ordning Flashdemo: bubble.swf
Selection sort Från början är hela listan osorterad Grundidén är att hela tiden välja ut det största elementet i den osorterade delen av listan och byta plats med det och det sista elementet i den osorterade delen av listan. Samtidigt ökar antalet element i den sorterade delen med ett och antalet i den osorterade delen minskar med ett. Flashdemo: selection.swf
Insertion sort Från början är hela listan osorterad. Grundidén är att samla de sorterade elementen i rätt ordning i början av listan. Ett element i taget från den osorterade delen insätts på rätt plats i den sorterade delen. Samtidigt ökar antalet element i den sorterade delen med ett och antalet i den osorterade delen minskar med ett. Flashdemo: insertion.swf