300 likes | 562 Views
Algorytmy i struktury danych. Studia stacjonarne: ECTS: 5 Wykłady: 30 Ćwiczenia: 30 Studia niestacjonarne: ECTS : 5 Wykłady: 20 Ćwiczenia:20. Literatura cz.1. Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, „Wprowadzenie do Algorytmów”, Wydawnictwo WNT, 2007
E N D
Algorytmy i struktury danych Studia stacjonarne: ECTS: 5 Wykłady: 30 Ćwiczenia: 30 Studia niestacjonarne: ECTS: 5 Wykłady: 20 Ćwiczenia:20
Literatura cz.1 • Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, „Wprowadzenie do Algorytmów”, Wydawnictwo WNT, 2007 Wydawnictwo Naukowe PWN, Warszawa 2012, • WirthNiklaus, „Algorytmy+StrukturyDanych=Programy”, Wydawnictwo WNT, 2004. • Sedgewick Robert, „Algorytmy w C++”, Wydawnictwo RM, Warszawa 1999, • Drozdek Adam, „C++. Algorytmy i Struktury Danych”, Wydawnictwo Helion, Gliwice 2004,
Literatura cz.2 • Wróblewski Piotr, „Algorytmy, Struktury Danych i Techniki Programowania”, Wydawnictwo Helion, Gliwice 2010. • Alfred V. Aho, Hopcroft John E. Ullman Jeffrey D., “Projektowanie I analiza algorytmów”, Wydawnictwo Helion, Gliwice 2003, • Alfred V. Aho, Hopcroft John E. Ullman Jeffrey D., “Algorytmy i struktury danych”, Wydawnictwo Helion, Gliwice 2003, • Banachowski Lech, Diks Krzysztof, Rytter Wojciech, „Algorytmy i Struktury danych”, Wydawnictwa Naukowo-Techniczne, Warszawa 1996. • Priceton University, Course on algorithms, http://code.google.com/intl/pl-PL/edu/submissions/SedgewickWayne/index.html, (w językuangielskim)
Podstawowe pojęcia • Algorytm to sposób rozwiązania pewnego zagadnienia, który można zrealizować za pomocą dowolnego języka programowania i na dowolnym komputerze • Struktury danych to obiekty, które powstają w wyniku zastosowania algorytmu do organizacji danych biorących udział w obliczeniach
Rekurencja • Rekurencja - wywołanie kilkakrotne pewnej procedury, która odwołuje się do samej siebie
Przykład funkcji rekurencyjnej double power(double x, unsigned int n){ if (n = = 0) return 1.0 //else return x*power(x,n-1) }
Rekurencja ogonowa: void ogon(int i){ if(i>0){ cout<<i<<’ ’; ogon(i-1); } } Rekurencja pośrednia: Funkcja1() funcja2() …funkcjan()funkcja1() Rekurencja zagnieżdżona:
Złożoność obliczeniowa • Złożoność obliczeniowa algorytmów to szacowanie efektywności porównywanych algorytmów, wykonujących to samo zadanie lecz innymi metodami. • Istotne są dwa czynniki: • Czas wykonania, • Zajętość pamięci.
Czasy rozwiązywania problemów o wielkich rozmiarach Źródło: R. Sedgewick, Algorytmy w C++, wyd. I., Wydawnictwo RM, Warszawa 1999, s. 38
Przykład 1 • Funkcja silnia 0!=1, n!=n*(n-1)!, n≥1, nN • Kod: Int silnia (int n){ If (n==0) return 1; Return n*silnia(n-1); }
Przykład 2 int count =0; for (int i=0; i<n; i++) if (a[i]==0) count++;
Przykład 3 int count =0; for (int i=0; i<n; i++) for (int j=i+1; j<n; j++) if (a[i]+a[j]==0) count++;
Notacja „tylda” – szacowanie składników • oszacuj czas działania (albo pamięci) jako funkcję, która przyjmuje dane wejściowe o rozmiarze n, • zignoruj wyrazy o mniejszej ważności: • gdy n jest duże, wyrazy są nieistotne, • gdy n jest małe, nie bierzemy ich pod uwagę
c2g(n) f(n) c1g(n) n n0 Notacja Θ • Dla danej funkcji g(n) oznaczamy przez Θ (g(n)) zbiór funkcji • Θ(g(n))={f(n): istnieją dodatnie stałe c1, c2 i n0 takie, że 0≤c1g(n) ≤f(n) ≤c2g(n) dla wszystkich n ≥n0}
cg(n) f(n) n n0 Notacja O • Dla danej funkcji g(n) oznaczamy przez O (g(n)) zbiór funkcji O(g(n))={f(n): istnieją dodatnie stałe c i n0 takie, że 0≤ f(n) ≤cg(n) dla wszystkich n ≥n0}
f(n) cg(n) n n0 Notacja Ω • Dla danej funkcji g(n) oznaczamy przez Ω (g(n)) zbiór funkcji Ω (g(n))={f(n): istnieją dodatnie stałe c i n0 takie, że 0≤cg(n) ≤f(n) dla wszystkich n ≥n0}
Twierdzenie Dla każdych dwóch funkcji f(n) i g(n) zachodzi zależność f(n)= Θ(g(n)) wtedy i tylko wtedy gdy f(n)=O(g(n)) i f(n)= Ω(g(n)). • Notacja o Dla danej funkcji g(n) oznaczamy przez o (g(n)) zbiór funkcji o(g(n))={f(n): dla każdej dodatniej stałej c istnieje stała n0 >0 taka, że 0≤f(n)<cg(n) dla wszystkich n ≥n0} • Notacja ω Dla danej funkcji g(n) oznaczamy przez ω (g(n)) zbiór funkcji ω (g(n))={f(n): dla każdej dodatniej stałej c>0 istnieje stała n0 >0 taka, że 0≤cg(n) <f(n) dla wszystkich n ≥n0}
Równania rekurencyjne • opisuje funkcję złożoności w zależności od jej wartości dla danych wejściowych o mniejszych rozmiarach • Trzy metody rozwiązywanie rekurencji: • metoda podstawiania • metoda iteracyjna • metoda rekurencji uniwersalnej
Metoda podstawiania • Metoda ta najpierw wymaga odgadnięcia postaci rozwiązania a następnie wykazania przez indukcję, że jest ono poprawne. Konieczne tez jest znalezienie odpowiednich stałych. • Metoda ta może być używana do określenia górnego albo dolnego oszacowania na wartości rozwiązania rekurencji
Przykład • Obliczyć ograniczenie górne funkcji zadanej zależności rekurencyjną
Przykład 2 • Zamiana zmiennych
Metoda iteracyjna • Polega na rozwijaniu (iterowaniu) rekurencji i wyrażeniu jej jako sumy składników zależnych tylko od n oraz warunków brzegowych. Następnie można użyć technik sumowania do oszacowania rozwiązania.
Przykłady • T(n)=9T(n/3)+n • T(n)=T(2n/3)+1 • T(n)=3T(n/4)+nlgn
Sortowanie przez wstawianie – Insertion sort Insertionsort (data[n]){ for (j=1;j<n;i++){ key=data[j]; //Wstaw data[j] w posortowany ciąg data[1..j-1] i=j-1; while i>0 i data[i]>key { data[i+1]=data[i]; i--; } data[i+1]=key; } }
Bibliografia • Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, „Wprowadzenie do Algorytmów”, Wydawnictwo Naukowe PWN, Warszawa 2012 • Sedgewick Robert, „Algorytmy w C++”, Wydawnictwo RM, Warszawa 1999, • Drozdek Adam, „C++. Algorytmy i Struktury Danych”, Wydawnictwo Helion, Gliwice 2004, • Wróblewski Piotr, „Algorytmy, Struktury Danych i Techniki Programowania”, Wydawnictwo Helion, Gliwice 2010, • Priceton University, Course on algorithms, http://code.google.com/intl/pl-PL/edu/submissions/SedgewickWayne/index.html,