1. Klasówka 2020/21 (03.12.2020)#
Zadanie 1 (8 punktów)#
Na uporządkowanym rosnąco n-elementowym ciągu
Przykład
Uporządkowany ciąg
Dana jest liczba całkowita k,
[3 punkty] Zaproponuj optymalne sortowanie ze względu na porównania dla k = 1 oraz
[1 punkt] n = 4
[2 punkty] n = 5
[5 punktów] Zaproponuj asymptotycznie optymalny algorytm sortowania k-zaburzonych ciągów n-elementowych. Pamiętaj o uwzględnieniu obu parametrów - n i k.
Podpowiedź
Ograniczenie dolne:
Dla ciągu 1-zaburzonego długości n, jego
permutacją kanoniczną nazwiemy permutację liczb od 1 do n otrzymaną przez przenumerowanie
kolejnych co do wartości liczb ciągu kolejnymi liczbami
Liczba permutacji kanonicznych jest równa
Każda permutacja kanoniczna wymaga innego posortowania elementów (jeśli nawet powstała z ciągu
z powtórzeniami, to powstaje też z jakiegoś ciągu bez powtórzeń).
Stąd ograniczeniem dolnym na liczbę porównań wymaganych do posortowania n-elementowego
ciągu 1-zaburzonego jest
a.1. (n = 4) Ograniczenie górne:
Oznaczmy kolejne elementy ciągu przez a, b, c, d.
Najpierw porównujemy b z c i w razie czego zamieniamy; wynikowy ciąg to a,
a.2. (n = 5) Ograniczenie górne:
Oznaczmy kolejne elementy ciągu przez a, b, c, d, e.
Najpierw porównujemy a z b.
Jeśli
b. W czasie
S := pusty stos
X := []
for i:= 1 to n do:
if !empty(S) and top(S) > a[i]:
{ jeden z elementów [top(S), a[i]] jest zaburzony - dla pewności dodajemy oba}
X := X + [top(S), a[i]]
pop(S)
else:
push(a[i])
A := elementy stosu S
Gdy już mamy wyznaczone zbiory A i X wystarczy
posortować elementy z X (co zajmuje czas
)scalić uporządkowany ciąg A z (uporządkowanym) X (co zajmuje czas
)
Całkowita złożoność to
W modelu porównań ten algorytm jest optymalny, co możemy udowodnić za pomocą redukcji
z problemu sortowania.
Dowolny ciąg C długości k możemy zamienić w ciąg k-posortowany długości n, dopisując
do niego n-k kolejnych liczb większych od jego maksimum.
Posortowanie wynikowego ciągu da przy okazji posortowany ciąg C, więc nie da się tego
zrobić w czasie
Zadanie 2 (4 punkty)#
Niech
Przykład
Tablica z zaznaczonym pewnym zbiorem rozproszonym o wadze -2.
Podpowiedź
Programowanie dynamiczne.
Stan to para
Wartość dla stanu to maksymalna waga podzbioru rozproszonego wybranego z pierwszych j kolumn tablicy, który w j-tej kolumnie wybiera liczby określone przez maskę m.
Z każdego stanu
Jest
Zadanie 3 (5 punktów)#
Dany jest zbiór S zawierający n różnych punktów
Podpowiedź
Powiemy, że punkt
Posortujmy punkty ze zbioru S według współrzędnych x; jeśli jakieś punkty mają
tę samą współrzędną x, zostawiamy tylko jeden z nich, o maksymalnej współrzędnej y.
Sortowaniem kubełkowym i algorytmem wyszukiwania maksimum robimy to wszystko
w czasie
Następnie wykonajmy następujący algorytm korzystający ze stosu. Utrzymujemy niezmiennik, że stos zawiera wszystkie punkty niezdominowane w zbiorze dotychczas rozważonych. Punkty na stosie będą posortowane po rosnących x i malejących y.
Q := pusty stos punktów
for each punkt (x, y) w podanej kolejności do:
while !empty(Q) and top(Q).y <= y:
pop(Q)
push(Q, (x, y))
return Q
Algorytm działa w czasie
Zadanie 4 (3 punkty)#
Dany jest nieskierowany graf
Podpowiedź
Niech d(v) oznacza odległość z wierzchołka s do wierzchołka v a c(v) oznacza szukaną liczbę różnych ścieżek długości d(v) z s do v. W trakcie działania algorytmu Dijkstry z s zapisujemy na liście wierzchołki w kolejności usuwania ich z kolejki priorytetowej. Następnie w tej kolejności będziemy im przypisywać wartości c(v).
Początkowo
Złożoność jest taka jak algorytmu Dijkstry, czyli w najlepszym razie