1 / 41

Algorytmy i struktury danych

Algorytmy i struktury danych. program wyk ł adu algorytm i dane, struktury danych notacja algorytmu symbole oszacowa ń asymptotycznych rekurencja i iteracja. Program wyk ł adu. Poj ę cia wst ę pne Rekurencja i iteracja Elementarne struktury danych Sortowanie i statystyki pozycyjne

dotty
Download Presentation

Algorytmy i struktury danych

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algorytmy i struktury danych program wykładu algorytm i dane, struktury danych notacja algorytmu symbole oszacowań asymptotycznych rekurencja i iteracja

  2. Program wykładu • Pojęcia wstępne • Rekurencja i iteracja • Elementarne struktury danych • Sortowanie i statystyki pozycyjne • Tablice z haszowaniem • Struktury drzewiaste • Drzewa zrównoważone • Struktury zorientowane na pamięć zewnętrzną • Złączalne struktury danych • Przegląd złożonych struktur danych • Metody konstrukcji algorytmów

  3. Program wykładu • Przegląd algorytmów: • Algorytmy grafowe • Wyszukiwanie wzorca • Algorytmy geometryczne • Problemy NP, algorytmy dokładne i przybliżone • Przeszukiwanie drzew decyzyjnych • Heurystyki ogólne: przeszukiwanie tabu, symulowane żarzenie, algorytmy genetyczne, sieci neuronowe

  4. Literatura • L.Banachowski i in. „Algorytmy i struktury danych” • T.Cormen i in. „Wprowadzenie do algorytmów” • N.Wirth „Algorytmy+Struktury danych = programy” • L.Banachowski i in. „Analiza algorytmów i struktur danych” • M.Sysło i in. „Algorytmy optymalizacji dyskretnej” • Krzysztof Goczyła „Struktury danych”

  5. Struktury danych • Sposób organizacji danych • Przykłady struktur: • Tablica • Lista • Lista dwukieunkowa • Drzewo • Kopiec

  6. Algorytm Jak zająć informatyka? Obróć kartkę na drugę stronę Obróć kartkę na drugę stronę skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania Algorytm: po skończonej liczbie kroków (czy zawsze i po ilu) daje poprawny (czy zawsze) i dokładny (na ile) wynik dla określonych (czy każdych) danych wejściowych

  7. Notacja algorytmu – język naturalny Wczytaj dane. Policz sumę wczytanych wartości i podziel przez ich liczbę. Wynik czyli średnią wypisz.

  8. Notacja algorytmu - pseudokod Dane := WczytajDane(); Suma := Sumuj_liczby(Dane); Licznik := Zlicz_liczby(Dane); Srednia := Suma / Licznik; Wypisz_wynik(Srednia); Function PoliczSrednia(Dane) Begin Suma := Sumuj_liczby(Dane); Licznik := Zlicz_liczby(Dane); PoliczSrednia := Suma / Licznik; End; int PoliczSrednia(Dane) { Suma = Sumuj_liczby(Dane) ; Licznik = Zlicz_liczby(Dane) ; return Suma / Licznik ; }

  9. Notacja algorytmu - diagram Start Wczytaj (Dane, N) Suma := 0 i := 0 i < N N T i := i+1 Wynik := Suma / i Suma := Suma + Dane[i]; Wypisz_wynik Stop

  10. Pseudokod • podstawienie = , porównianie== • instrukcje złożone kończymy: • bloki zaznaczamy przez wcięcie (zamiast {/}, begin/end) • linie kontynuujemy przez \ na końcu • komentarz zaczynamy od # • instrukcja warunkowaifwarunek:czynność ifwarunek:czynnośćelse :czynność • dla skrótu else : if oznaczać będziemy przez elif • pętla iteracyjna forzmiennainlista:czynność • pętla whilewarunek: czynnośćelse: czynnośćelse oznaczakod wykonany po niespełnionym warunku • przerwanie pętli break,kontynuacja pętli continue • nic nie rób (np. po if) pass • instrukcje opisowe

  11. Przykład algorytmu • Czy liczba m jest potegą n czyli czy m = nk, gdzie m, n>=2, kC defIsPower(m, n): p=1 while p<m: p = p*n return p==m Czy algorytm ma własność stopu? Czy algorytm zwraca poprawny wynik? Formalny dowód poprawności jest czesto bardzo trudny ...

  12. Czasem nawet nie wiadomo • ... czy algorytm się kończy? • Problem Colatza – czy poniższy algorytm się kończy dla dowolnej liczby naturalnej defCollatz(x): while x>1: if x%2==0: x = x/2 else: x = x*3+1

  13. Po co są algorytmy … aby rozwiązywać problemy 

  14. Po co wymyślać nowe algorytmy … aby rozwiązywać problemy lepiej szybciej, dokładniej, łatwiej

  15. Przykład: dane kontrahentów I • Strukturadanych : nieuporządkowany “plik“ kartek defAddNew(phoneBook, newEntry): append_new_entry(phoneBook, newEntry) defFind(phoneBook, entryTofind): current= None while not end_of(phoneBook) and \ current!=entryTofind: current=get_next(phoneBook) if current==entryTofind: returncurrent else: returnNone

  16. Przykład: dane kontrahentów II • Strukturadanych : posortowanekartek defAddNew(phoneBook, newEntry): position=Find(phoneBook, newEntry) ifposition<len(phoneBook) and \phoneBook[position] ==newEntry: print("kontrahent już istnieje“) elif: add_new_entry(phoneBook, position, newEntry) • def Find(phoneBook, what): returnFindBin(phoneBook,0,len(phoneBook)-1,what)

  17. Przykład: danekontrahentów II def SearchBin(phoneBook, left, right, element): if left >= right : if phoneBook[left] >= element : return left else:return left +1 mid = (left + right) // 2 if phoneBook[mid] == element : return midif phoneBook[mid] > element : return SearchBin(phoneBook,left,mid-1,element)else: return SearchBin(phoneBook, mid+1,right,element)

  18. Czy to działa? • Zamiast • current == entryToFind w praktycepowinnobyć • current.name == nameToFind • current.key == keyToFind

  19. Porównanie algorytmów • Pierwszy algorytm jest prostszy • Drugi algorytm wymaga struktury o dostępie swobodnym (np. tablicy, drzewa) lub wymaga przepisywania elementów A szybkość?

  20. Porównanie algorytmów • Ktory algorytm jest szybszy? • Czasy wykonania zależą od procesora, jakości kompilatora itd. • Liczba operacji uniezależnia nas od szybkości komputera • Liczba operacji dla pierwszego algorytmu: • Dodawanie elementu => 1 operacja • Przeszukiwania z sukcesem => średnio N/2, najgorzej N • Przeszukiwania z porażką => N operacji • Liczba operacji dla drugiego algorytmu: • Przeszukiwania z porażką => log N operacji • Przeszukiwania z sukcesem => log N operacji • Dodawanie elementu => log N lub log N + N/2, w zależności od czasu wstawanie elementu

  21. Co mogą znaczyć te liczby • Algorytm I • Dla 100 i 10 poszukiwań Tworzenie pliku: T = 100 Szukanie: T <= 10*100 = 1000 • Dla 100 i 100 poszukiwań Tworzenie pliku: T=100 Szukanie: T <= 100*100 = 10000 • Algorytm II • Dla 100 i 10 poszukiwań Tworzenie pliku: T <= 100*log2100 ~ 650 Szukanie: T <= 10* log2100 ~ 65 • Dla 100 i 100 poszukiwań Tworzenie pliku: T <= 100*log2100 ~ 650 Szukanie: T <= 100* log2100 ~ 650

  22. Dlaczego tylko mogą znaczyć ? Mamy 2 algorytmy, które wykonają odpowiednio 100 x operacjioraz 10 x2operacji. Który jest lepszy? 100 c1 x ? 10 c2 x2 c1’ x ? c2’x2

  23. Tempo wzrostu • Zamiast pytania - co jest większe: • 10X + 100 • 100X + 10 • X2 • Pytamy co szybciej rośnie, np: • ln x • X • X2 W kontekście algorytmu pytamy jak wzrośnie czas wykonania jeśli dane wzrosną o 1 lub 2 razy itd.

  24. Ćwiczenie • Uszerguj wg. tempa wzrostu: • ln x, lg x, log2 x • Uszerguj wg. tempa wzrostu:log x, x, x, x2, x x , 2x, ex,x!, xx

  25. Symbol  (g(x)) oznacza zbiór takich funkcji f(x), żeistnieją dodatnie stałe c1, c2, n0 ,takie że dla wszystkich n >= n0 0<= c1*g(n) <= f(n) <= c2*g(n) Mówimy, że f(x) (g(x)) lub w skrócie f(x) = (g(x)) Przykłady: 10x2+5x-7 = (x2), ln x2 = (log x)

  26. Symbol O O(g(x)) oznacza zbiór takich funkcji f(x), że istnieją dodatnie stałe c, n0 ,takie, że dla wszystkich n >= n0 0<= f(n) <= c*g(n) Mówimy, że f(x)  O(g(x)) lub w skrócie f(x) = O(g(x)) Przykłady: x2= O (x2), x= O (x2)

  27. Symbol  (g(x)) oznacza zbiór takich funkcji f(x), żeistnieją dodatnie stałe c, n0 ,takie, że dla wszystkich n >= n0 0<= c*g(n) <= f(n) Mówimy, że f(x) (g(x)) lub w skrócie f(x) = (g(x)) Przykłady: x2=  (x2), x2 * ln x= O (x2)

  28. Symbol o o(g(x)) oznacza zbiór takich funkcji f(x), żedla każdej dodatniej stałej c istnieje dodatnie n0 ,takie, że dla wszystkich n >= n0 0<= f(n) < c*g(n) Mówimy, że f(x)  o(g(x)) lub w skrócie f(x) = o(g(x)) Przykłady: x2+x  o (x2), ln x= o (x)

  29. Symbol  (g(x)) oznacza zbiór takich funkcji f(x), że dla każdej dodatniej stałej c istnieje dodatnie n0 ,takie, że dla wszystkich n >= n0 0<= c*g(n) < f(n) Mówimy, że f(x) (g(x)) lub w skrócie f(x) = (g(x)) Przykłady: x2 (x2), x2 * ln x=  (x2)

  30. Symbole oszacowań - podsumowanie • o –> wolniej niż • O –> nie szybciej niż •  -> szybciej niż •  -> nie wolniej niż •  -> tak samo • f(n) = o(g(n)) oznacza, że lim f(n)/g(n) = 0 dla n • f(n) = (g(n)) oznacza, że lim f(n)/g(n) =  dla n

  31. Czym różnią się algorytmy ? • Szybkość działania (złożoność obliczeniowa czasowa) • Zajętość pamięci (złożoność pamięciowa) • Dokładność • Dziedzina (dane dla których alg. jest poprawny) • Komplikacja algorytmu • Stabilność numeryczna

  32. Złożoność obliczeniowa • Czasowa: Liczba operacji wyrażona jako funkcja rozmiaru danych • Pamieciowa: Rozmiar dodatkowej pamięci (bez danych wejściowych) wymagany przez algorytm wyrażony jako funkcja rozmiaru danych

  33. Iteracja • Klasyczne algorytmy wykorzystujące pętle, zmienne chwilowe itd, ale nie zawierające wołania „samego siebie” • Liczba operacji (złożoność) odpowiada liczbie wykonań najbardziej zagnieżdzonej pętli defFactorialIter(n): ret=1 while n>1: ret = ret * n n = n-1 return ret

  34. Rekurencja • Funkcjawywołujesamąsiebie • Rekurencjajawna - podprogramwoła samegosiebiedeff(n):f(n-1)#brak warunku zakończenia !!! • Rekurencjaniejawna defa(n):b(n/2) defb(n):a(n-1) • Liczbaoperacji?

  35. Algorytmy rekurencyjne • Często algorytmy rekurencyjne mają charakter bardziej zwarty niż analogiczne alg. iteracyjne UWAGAna warunek wyjścia def f(): f() # rekurencja nieskończona

  36. Algorytmy rekurencyjne - silnia n=5 120 defFactorialRec (n):if n <=1 :return 1else:return n * FactorialRec(n-1) return 5 * 24 n=4 return 4 * 6 n=3 return 3 * 2 n=2 n=1 return 2 * return 1 1

  37. Głębokość rekurencji • Każda instancja funkcji zajmuje miejsce na stosie • Instancja = zmienne lokalne + adres powrotu • Rozmiar stosu w C/C++ jest silnieograniczony • Problem mogą stanowić • duże zmienne lokalne • duże parametry(struktury są kopiowane) • tablice lokalne n=5 return 5 * n=4 return 4 * n=3 return 3 * n=2 n=1 return 2 * return 1

  38. Przykład algorytmu • Największy wspólny dzielnik liczb m i n, gdzie m>=n>0 oraz m,nC defGCD(m,n): whilen!=0: tmp = m%n m = n n = tmp return m Czy algorytm ma własność stopu? Czy algorytm zwraca poprawny wynik?

  39. Przykład algorytmu • Największy wspólny dzielnik liczb m i n, gdzie m>=n, m>=1, n>=1, mC, nC def NWD(m,n): ifm%n ==0: return n else: return NWD(n, m%n) Czy algorytm ma własność stopu? Czy algorytm zwraca poprawny wynik?

  40. Rekurencja vs. iteracja • Każdy algorytm rekurencyjny mozna zapisać w sposób iteracyjny i odwrotnie • Potencjalne problemy związane z rekurencją: • głębokość rekurencji (złożoność pamięciowa) • nadmiarowe obliczenia (CZAS OBLICZEŃ)

  41. Rekurencja vs. iteracja def FibRec(n): ifn<=2:return 1else:return FibRec(n-1)+FibRec(n-2) defFibIter(n) cur=1 last=1 whilen>2: n=n-1last, cur = cur, cur+last return cur Która wersja jest szybsza proszę sprawdzić w domu np. dla 500?

More Related