Processing math: 100%

Ćwiczenia 1: poprawność i złożność algorytmu

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:

  1. zaproponuj algorytm działający w czasie O(logn),
  2. udowodnij poprawność swojego algorytmu metodą niezmienników.

Zadanie 2 (Liczby Fibonacciego)

Liczby Fibonacciego definiuje się jak następuje:
F0=0,F1=1,
Fn=Fn2+Fn1, 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.

  1. Ile dodawań wykonamy obliczając Fn rekurencyjnie?
  2. Zastosuj metodę programowania dynamicznego (tablicowania wcześniej policzonych wyników) do policzenia Fn w czasie O(n).
  3. Wiadomo, że
  4. [Fn+1Fn]=[1110][FnFn1].
    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..n1] 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..n1] będzie tablicą (ciągiem) liczb całkowitych. Parę indeksów (i,j), 0i<j<n, nazwiemy inwersją tablicy A wtedy i tylko wtedy, gdy A[i]>A[j].

  1. Jaka może być najmniejsza, a jaka największa liczba inwersji w tablicy A?.
  2. Przy założeniu, że w tablicy A zapisano permutację liczb od 0,1,,n1, 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.
  3. Zaproponuj algorytm programowania dynamicznego, który dla danych liczb całkowitych k,n takich, że n>0,0kn(n1)2, obliczy liczbę permutacji liczb 0,1,,n1, które zawierają dokładnie k inwersji.

Zadanie 5 (Inwersje II)

Niech A[0..n1] będzie n-elementowym ciągiem liczbowym. Wektorem inwersji dla ciągu A nazywamy tablicę B[0..n1] taką, że B[j]=|{0i<j:B[i]>B[j]}|.

  1. Udowodnij, że istnieje wzajemnie jednoznaczna odpowiedniość pomiędzy permutacjami A[0..n1] liczb 0,1,,n1, a wektorami B[0..n1] takimi, że 0B[j]<j+1, dla j=0,1,,n1.
  2. Dane są, dodatnia liczba całkowita n oraz wektor (inwersji) B[0..n1], 0B[j]<j+1, dla j=0,1,,n1. Zaprojektuj algorytm, który w czasie O(nlogn) znajdzie permutację A[0..n1] liczb 0,1,,n1, dla której wektorem inwersji jest B.