Zadanie 1 (Potęgowanie binarne)
Zaprojektuj algorytm, który dla danych nieujemnej liczby całkowitej n i liczby całkowitej a, policzy wartość an. Przyjmij za operację dominującą mnożenie dwóch liczb całkowitych i w tym modelu:
- zaproponuj algorytm działający w czasie O(logn),
- udowodnij poprawność swojego algorytmu metodą niezmienników.
Zadanie 2 (Liczby Fibonacciego)
Liczby Fibonacciego definiuje się jak następuje:
F0=0,F1=1,
Fn=Fn−2+Fn−1, dla n>1.
Dla danej nieujemnej liczby całkowitej n, należy policzyć liczbę Fn. Za operacje dominujące przyjmujemy operacje arytmetyczne - dodawanie, odejmowanie lub mnożenie dwóch liczb całkowitych.
- Ile dodawań wykonamy obliczając Fn rekurencyjnie?
- Zastosuj metodę programowania dynamicznego (tablicowania wcześniej policzonych wyników) do policzenia Fn w czasie O(n).
- Wiadomo, że
[Fn+1Fn]=[1110][FnFn−1].
Wykorzystaj powyższy fakt do zaproponowania algorytmu obliczania Fn w czasie O(logn).
Zadanie 3 (Pary liczb)
Dana jest dodatnia liczba całkowita n, uporządkowana niemalejąco tablica dodatnich liczb całkowitych A[0..n−1] oraz dodatnia liczba całkowita C. Zaprojektuj efektywny algorytm wyznaczenia najliczniejszego zbioru rozłącznych par elementów tablicy A takich, że suma elementów w każdej parze jest nie większa niż C. Uzasadnij poprawność swojego algorytmu i dokonaj analizy jego złożoności obliczeniowej.
Zadanie 4 (Inwersje I)
Niech A[0..n−1] będzie tablicą (ciągiem) liczb całkowitych. Parę indeksów (i,j), 0≤i<j<n, nazwiemy inwersją tablicy A wtedy i tylko wtedy, gdy A[i]>A[j].
- Jaka może być najmniejsza, a jaka największa liczba inwersji w tablicy A?.
- Przy założeniu, że w tablicy A zapisano permutację liczb od 0,1,…,n−1, zaproponuj algorytm typu "dziel i rządź" wyznaczający liczbę inwersji w A w czasie O(nlogn). Uzasadnij poprawność i dononaj analizy złożoności obliczeniowej zaproponowanego algorytmu.
- Zaproponuj algorytm programowania dynamicznego, który dla danych liczb całkowitych k,n takich, że n>0,0≤k≤n(n−1)2, obliczy liczbę permutacji liczb 0,1,…,n−1, które zawierają dokładnie k inwersji.
Zadanie 5 (Inwersje II)
Niech A[0..n−1] będzie n-elementowym ciągiem liczbowym. Wektorem inwersji dla ciągu A nazywamy tablicę B[0..n−1] taką, że B[j]=|{0≤i<j:B[i]>B[j]}|.
- Udowodnij, że istnieje wzajemnie jednoznaczna odpowiedniość pomiędzy permutacjami A[0..n−1] liczb 0,1,…,n−1, a wektorami B[0..n−1] takimi, że 0≤B[j]<j+1, dla j=0,1,…,n−1.
- Dane są, dodatnia liczba całkowita n oraz wektor (inwersji) B[0..n−1], 0≤B[j]<j+1, dla j=0,1,…,n−1. Zaprojektuj algorytm, który w czasie O(nlogn) znajdzie permutację A[0..n−1] liczb 0,1,…,n−1, dla której wektorem inwersji jest B.