Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Podobne dokumenty
Zaawansowane algorytmy i struktury danych

Luty 2001 Algorytmy (4) 2000/2001

Algorytmy i struktury danych. Wykład 4

Algorytmy w teorii liczb

CIĄGI wiadomości podstawowe

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Analiza algorytmów zadania podstawowe

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Logarytmy. Funkcje logarytmiczna i wykładnicza. Równania i nierówności wykładnicze i logarytmiczne.

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Przykładowe zadania z teorii liczb

Materiały dla finalistów

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Zasady analizy algorytmów

Piotr Chrząstowski-Wachtel Uniwersytet Warszawski. Al Chwarizmi i trzy algorytmy Euklidesa

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Wykład z równań różnicowych

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Algorytmy i Struktury Danych, 2. ćwiczenia

Jeszcze o algorytmach

1 Całki funkcji wymiernych

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Indukcja matematyczna. Zasada minimum. Zastosowania.

6. Pętle while. Przykłady

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Podstawy Informatyki. Sprawność algorytmów

Rozwiązywanie zależności rekurencyjnych metodą równania charakterystycznego

Wyszukiwanie binarne

7. Pętle for. Przykłady

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

Lista 2 logika i zbiory. Zad 1. Dane są zbiory A i B. Sprawdź, czy zachodzi któraś z relacji:. Wyznacz.

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Matematyka Dyskretna Zestaw 2

Algorytm selekcji Hoare a. Łukasz Miemus

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

5. Rekurencja. Przykłady

Całka nieoznaczona, podstawowe wiadomości

Indukcja matematyczna

LISTA 5. C++ PETLE for, while, do while

Algorytm i złożoność obliczeniowa algorytmu

Zadania do samodzielnego rozwiązania

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Maciej Piotr Jankowski

WYRAŻENIA ALGEBRAICZNE

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

LISTA 1 ZADANIE 1 a) 41 x =5 podnosimy obustronnie do kwadratu i otrzymujemy: 41 x =5 x 5 x przechodzimy na system dziesiętny: 4x 1 1=25 4x =24

13. Równania różniczkowe - portrety fazowe

Sumy kwadratów kolejnych liczb naturalnych

Lista 6. Kamil Matuszewski 13 kwietnia D n =

Rzut oka na współczesną matematykę spotkanie 3: jak liczy kalkulator i o źródłach chaosu

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie:

Matematyka dyskretna. Andrzej Łachwa, UJ, a/15

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

W. Guzicki Próbna matura, grudzień 2014 r. poziom rozszerzony 1

Warmińsko-Mazurskie Zawody Matematyczne Eliminacje cykl styczniowy Poziom: szkoły ponadgimnazjalne, 10 punktów za każde zadanie

Największy wspólny dzielnik Algorytm Euklidesa (także rozszerzony) WZAiP1: Chińskie twierdzenie o resztach

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Rozwiązania prac domowych - Kurs Pochodnej. x 2 4. (x 2 4) 2. + kπ, gdzie k Z

TEORETYCZNE PODSTAWY INFORMATYKI

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Dodawanie ułamków i liczb mieszanych o różnych mianownikach

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

2. DZIAŁANIA NA WIELOMIANACH

WHILE (wyrażenie) instrukcja;

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Lista 0. Kamil Matuszewski 1 marca 2016

Prawdopodobieństwo i statystyka

Algorytm Euklidesa. Dwie monety - jeden problem. Trochę matematyki 180=36*5 180=60*3

ALGORYTMY I STRUKTURY DANYCH

Wykład z równań różnicowych

Jarosław Wróblewski Matematyka Elementarna, zima 2012/13

Matematyka A kolokwium: godz. 18:05 20:00, 24 maja 2017 r. rozwiązania. ) zachodzi równość: x (t) ( 1 + x(t) 2)

Tydzień nr 9-10 (16 maja - 29 maja), Równania różniczkowe, wartości własne, funkcja wykładnicza od operatora - Matematyka II 2010/2011L

RÓWNANIA RÓŻNICZKOWE ZWYCZAJNE

Algorytmy i Struktury Danych.

Podstawowe algorytmy i ich implementacje w C. Wykład 9

KURS WSPOMAGAJĄCY PRZYGOTOWANIA DO MATURY Z MATEMATYKI ZDAJ MATMĘ NA MAKSA. przyjmuje wartości większe od funkcji dokładnie w przedziale

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Analiza matematyczna dla informatyków 3 Zajęcia 14

Rekurencja (rekursja)

Równania różniczkowe liniowe II rzędu

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

dr inż. Ryszard Rębowski 1 WPROWADZENIE

Złożoność informacyjna Kołmogorowa. Paweł Parys

Dwa równania kwadratowe z częścią całkowitą

Procesy stochastyczne WYKŁAD 2-3. Łańcuchy Markowa. Łańcuchy Markowa to procesy "bez pamięci" w których czas i stany są zbiorami dyskretnymi.

Wokół Problemu Steinhausa z teorii liczb

do instrukcja while (wyrażenie);

Prezydent wszystkich kombinacji czyli rzecz o filtrowaniu systemów Lotto

Programowanie - instrukcje sterujące

Arytmetyka. Działania na liczbach, potęga, pierwiastek, logarytm

Transkrypt:

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność optymistyczną i pesymistyczną. Rozwiązanie może wyglądać na przykład tak: #include<stdio.h> void wypisz(int n, int rozklad[], int ile_czynnikow) printf("%d = ", n); for(int i=0; i<ile_czynnikow; i++) if(i > 0) printf(" * "); printf("%d", rozklad[i]); printf("\n"); int main() int n, podzielone_n; int rozklad[1000]; int ile_czynnikow = 0; scanf("%d", &n); podzielone_n = n; for(int i=2; i*i<=n; i++) while(podzielone_n % i == 0) podzielone_n /= i; rozklad[ile_czynnikow++] = i; 1

if(podzielone_n!= 1) rozklad[ile_czynnikow++] = podzielone_n; if(ile_czynnikow == 0) rozklad[ile_czynnikow++] = n; wypisz(n, rozklad, ile_czynnikow); return 0; Najpierw warto uzasadnić, czemu ten program działa. Najpierw zauważyć trzeba, że każda liczba n może mieć co najmniej jeden czynnik pierwszy większy od n (bo gdyby były dwa, to ich iloczyn przekroczyłby n). Celem pętli for jest znalezienie czynników pierwszych nie większych niż n. Dla każdej liczby sprawdzamy, czy jest dzielnikiem i jeśli tak to traktujemy ją jako czynnik pierwszy. Nie trzeba testować pierwszości, bo na bieżąco dzielmy podzielone n przez dotychczas znalezione dzielniki. Innymi słowy, na początku każdego obrotu pętli for wartość podzielone n to n podzielone przez wszystkie swoje czynniki pierwsze mniejsze od i. Stąd od razu wynika, że jeśli i jest dzielnikiem podzielone n to jest liczbą pierwszą, bo jest też najmniejszym (poza jedynką) dzielnikiem liczby podzielone n. Operacją dominującą jest tu policzenie warunku w pętli while. W funkcji wypisz wprawdzie też jest pętla, jednak wykonuje się ona tyle razy, ile jest elementów w tablicy rozklad, a wszystkie elementy (poza ewentualnie dwoma) wstawiamy do tablicy w pętli while. Warunek pętla while zostanie sprawdzony co najmniej raz w każdym obrocie pętli for, czyli n razy plus raz na każdy znaleziony czynnik pierwszy. Każda liczba składa się z co najwyżej log 2 n czynników pierwszych. Więcej być nie może, bo nawet jeśli czynniki są najmniejsze możliwe (czyli równe 2) to zmieści się ich właśnie tyle. Zatem algorytm działa w czasie O( n+log n) = O( n), bo log n to wartość dużo mniejszego rzędu niż n. Zadanie 2. Dana jest tablica a, która zawiera parami różne liczy całkowite. W tej tablicy chcemy znaleźć drugą co do wielkości liczbę przy użyciu możliwie małej liczby porównań. Standardowe podejście dałoby około 2n operacji porównania dwóch liczb, jednak okazuje się, że można to nieco poprawić. Opis algorytmu poniżej. Najpierw szukamy maksimum w tablicy, w dosyć specyficzny sposób: Porównaj a[0] z a[1], a[2] z a[3], a[4] z a[5] itd. Każde takie porównanie pozwala nam odrzucić jedną liczbę, bo na pewno nie będzie ona największa w całej tablicy. Ostatecznie wyrzucimy około połowę (w tablicy nieparzystego rozmiaru mniejszą połowę ) wszystkich liczb. Jeśli została jedna liczba, to znaleźliśmy maksimum. wykonać się rekurencyjnie dla liczb, które pozostały. Jeśli nie - trzeba W ten sposób znajdziemy maksimum, nazwijmy je M. Teraz załóżmy, że zapisaliśmy sobie gdzieś na boku listę wszystkich par liczb, które porównywaliśmy, 2

tj. mamy listę wpisów porównuję x z y. Łatwo zauważyć, że na pewno kiedyś musieliśmy porównać M z drugą co do wielkości liczbą w tablicy. Wystarczy więc spojrzeć na wszystkie liczby, które były kiedyś porównane z M i znaleźć największą spośród nich (to już robimy normalnie). Zadanie polega na możliwie dokładnym policzeniu liczby wykonanych porównań. Nie jest ważny czas działania całości algorytmu (który przy dobrej implementacji wynosi O(n)). Można ograniczyć się do przypadku, gdy n jest potęgą dwójki. Rozwiązanie W fazie szukania maksimum wykonamy dokładnie n 1 porównań, bo po każdym porównaniu odrzucamy dokładnie jednego kandydata do maksimum. Sprawa komplikuje się nieco w drugiej fazie, więc załóżmy najpierw, że n = 2 k dla pewnego całkowitego k. Zastanówmy się ile liczb było porównywanych z M w trakcie działania algorytmu. Jedna liczba była porównana, gdy było wszystkich było 2 k, następna, gdy pozostało 2 k 1, i tak dalej. Ostatnie porównanie było dla 2 1 = 2 liczb. Zatem kandydatów do prawie-maksimum jest k. Spośród nich znajdziemy największą liczbę w k 1 porównaniach. Jeśli przez T (n) oznaczymy liczbę porównań wykonaną przez algorytm, to właśnie dostaliśmy, że: Z drugiej strony, dla k + 1: T (2 k ) = 2 k 1 + k 1. T (2 k+1 ) = 2 k+1 1 + (k + 1) 1. Czas działania pierwszej fazy potrafimy podać dokładnie, zaś czas działania drugiej wzrósł jedynie o 1. Teraz spójrzmy, co dzieje się w ogólnym przypadku, jeśli 2 k n < 2 k+1, czyli k = log 2 n. W takiej sytuacji druga faza może wymagać k 1 lub k porównań (zależy od n oraz od miejsca w tablicy, w którym jest maksimum). Dostaniemy więc: T (n) = n + log 2 n + O(1). co oznacza, że wartość n + log 2 n to wynik z dokładnością do stałej. Zadanie 3. Rozwiąż równanie rekurencyjne T (n) = n + 2T ( 2n 3 ). Uwaga: teraz zorientowałem się, że w pierwotnej wersji nie wstawiłem symbolu podłogi (wcześniej było 2T ( 2n 3 )). Tym razem wygodnie rozpatrzyć najpierw przypadek, gdy n = ( 3 2 )i. Mamy wtedy: co da się zapisać w postaci: T (( 3 2 )i+1 ) = ( 3 2 )i+1 + 2T (( 3 2 )i ) a k+1 = ( 3 2 )k+1 + 2a k. a 0 = 1 Dalej są dwie metody postępowania. 3

Metoda 1. Postępujemy zgodnie z ogólną metodą radzenia sobie z takimi rekurencjami. Równanie jednorodne: Równanie charakterystyczne: a k+1 = 2a k. λ 2 = 0. Jedyny pierwiastek to λ = 2. Teraz zapisujemy resztę w postaci p(k)µ k : ( 3 2 )k+1 = 3 2 ( 3 2 )k Z faktu z wykładu wiemy, że pewnym rozwiązaniem rekurencji jest a k = k r q(k)µ k, gdzie r to krotność µ jako rozwiązania równania charakterystycznego, zaś q(k) to wielomian takiego samego stopnia, jak p(k). W naszym przypadku µ = 3 2 nie jest rozwiązaniem, zatem r = 0. Wielomian p(k) jest stały, więc tak samo będzie z q(k) przyjmijmy q(k) = Q. Wstawiamy to, co otrzymaliśmy, do równania rekurencyjnego: Teraz wiemy, że Q( 3 2 )k+1 = ( 3 2 )k+1 + 2Q( 3 2 )k Q 3 2 = 3 2 + 2Q Q 2 = 3 2 Q = 3 a k = 3( 3 2 )k to pewne rozwiązanie równania. Należy do niego dodać jakieś rozwiązanie C2 k równania jednorodnego, by uzyskać równanie spełniające warunek początkowy, tzn. wartość C dobrać tak, by: spełniało Połączmy te równania: a k = 3( 3 2 )k + C2 k a 0 = 1. 3( 3 2 )0 + C2 0 = 1 3 + C = 1 C = 4 Rozwiązaniem rekurencji jest zatem: a k = 3( 3 2 )k + 4 2 k Na pierwszy rzut oka trochę dziwny może wydawać się ten minus, jednak w rzeczywistości 2 k to funkcja rosnąca o wiele szybciej od ( 3 2 )k i wynik faktycznie jest nieujemny. 4

Metoda 2. Można sukcesywnie rozwijać rekurencję, tzn. za a k wstawić ( 3 2 )k + 2a k 1, potem podstawić pod a k 1 itd. W ten sposób wyrazimy a k w postaci sumy ciągu geometrycznego. Sumę tę da się zwinąć przy użyciu wzoru: 1 + q + q 2 +... + q n = afrac1 q n + 11 q Niezależnie od tego, z której metody korzystaliśmy, na koniec trzeba wrócić do początkowych oznaczeń. U nas k = log 3 n. Zatem 2 T (n) = T (( 3 2 )k ) = 3( 3 2 )log 1.5 n + 4 2 log 1.5 n T (n) = 3n + 4 2 log 1.5 2 log 2 n = 3n + 4n log 1.5 2. Tu skorzystaliśmy ze wzoru log a c = log a b log b c. Ostatni krok to zapisanie wyniku dla dowolnego n. Trzeba zauważyć, że wynik dla T (( 3 2 )k+1 ) jest nie większy niż pewna stała przemnożona przez wynik dla T (( 3 2 )k ). Zatem w ogólności można napisać: T (n) = O(4n log 1.5 2 3n) = O(n log 1.5 2 ) = O(n 1.71 ) Na egzaminie nie trzeba oczywiście obliczać przybliżonej wartości logarytmu, ale wstawiłem taki wynik, żeby można było zobaczyć ile mniej więcej wychodzi. 5