Egzamin poprawkowy 2015/16 (18.02.2016)#
Zadanie 1 [20 punktów]#
W tym zadaniu rozważamy grafy, które można przedstawić na płaszczyźnie jako wielokąty wypukły zawierająca maksymalną liczbę nieprzecinających się przekątnych. Takie grafy nazywamy wielokątowymi. Wierzchołkom grafu wielokątowego odpowiadają wierzchołki wielokąta ponumerowane od 1 do n, zgodnie z kolejnością ich występowania na obwodzie. Krawędziom grafu odpowiada n boków i n-3 przekątnych wielokąta. Graf wielokątowy zadajemy przez liczbę n > 2 oraz ciąg 2n-3 par wierzchołków wyznaczających krawędzie grafu. Zakładamy ponadto, że z każdą krawędzią e dana jest całkowitoliczbowa waga w(e).
[4 punkty] Jaka może być minimalna, a jaka maksymalna wysokość BFS-drzewa w wielokątowym grafie o 2016 wierzchołkach?
[5 punktów] Jaka może być minimalna, a jaka maksymalna wysokość DFS-drzewa w wielokątowym grafie o 2016 wierzchołkach?
[3 punkty] Rozważmy dowolny, spójny graf z parami różnymi wagami na krawędziach. Udowodnij, że dla każdego wierzchołka, krawędź o minimalnej wadze incydentna z tym wierzchołkiem należy do minimalnego drzewa rozpinającego.
[8 punktów] Zaproponuj algorytm, który w czasie liniowym wyznacza minimalne drzewo rozpinające w grafie wielokątowym.
Zadanie 2 [10 punktów]#
Sortujemy ciągi zero-jedynkowe za pomocą operacji porównania \(\le\) (mniejsze lub równe).
[5 punktów] Zaproponuj algorytm sortowania ciągu zero-jedynkowego o długości n, optymalny ze względu na porównania \(\le\) (interesuje nas dokładna, pesymistyczna liczba porównań). Udowodnij optymalność swojego algorytmu.
[5 punktów] Zaproponuj stabilny algorytm sortowania ciągu zero-jedynkowego o długości n za pomocą n + o(n) porównań \(\le\).
Zadanie 3 [10 punktów]#
Zaproponuj strukturę danych, które na dynamicznie zmieniającym się ciągu liczbowym umożliwia wydajne wykonywanie następujących operacji:
Ini(\(\alpha\)):: \(\alpha\) := <> //utwórz pusty ciąg; operacja wykonywania tylko raz, na samym początku
Insert(\(\alpha\),a,k):: wstaw a jako k-ty element ciągu, \(1 \le k \le |\alpha|+1\)
Delete(\(\alpha\),a,k):: usuń k-ty element ciągu \(\alpha\), \(1 \le k \le |\alpha|\)
Sum(\(\alpha\),i,j):: podaj sumę elementów na pozycjach i, i+1,…, j, \(1 \le i \le j \le |\alpha|\)
Replace(\(\alpha\),i,j,a):: zamień każdy z elementów z pozycji i, i+1,…, j na a, \(1 \le i \le j \le |\alpha|\)