przydatne linki:




  1. B-drzewo:
    jest drzewem zrównoważonym
    jest drzewem binarnym
    jest drzewem AVL
    jest drzewem binarnym pełnym
    ma operację sumowania elementów w czasie

    * wg niektórych źródeł 'b' w 'b-drzewie' znaczy balanced (zrównoważone). B-drzewo z definicji jest zrównoważone. Szczególną własnością b-drzewa jest jego szerokość/rozłożystośc. W b-drzewie każdy wierzchołek poza korzeniem musi mieć n...2n+1 węzłów potomnych. Wierzchołek drzewa binarnego z definicji ma <= 2 węzły potomne, a drzewo AVL z definicji jest drzewem binarnym

  2. Mamy graf skierowany złożony z wierzchołków {a,b,c,d} i krawędzi: a->b, a->c, b->a, b->c, c->a, c->b. Jest on:
    spójny
    drzewem
    pełny
    graph

    * wiki: Graf nazywamy spójnym, jeśli dla każdej pary wierzchołków istnieje marszruta je łącząca. Zatem nie jest spójny (z powodu wierzchołka D)
    wiki: Graf pełny jest grafem prostym, w którym dla każdej pary węzłów istnieje krawędź je łącząca. Zatem nie jest pełny (jw.).
    Drzewo to graf spójny bez cykli, więc dany graf również nie jest drzewem

  3. Wstawiamy do pustego drzewa BST kolejno: 6 0 5 3 1 4 2. Wypisując wartości węzłów przy przejściu tego drzewa w porządku postorder, otrzymamy:
    2 1 4 3 5 0 6
    0 1 2 3 4 5 6
    graph
  4. Listę, ze zmodyfikowaną operacją get, która przesuwa żądany element na początek listy:
    warto używać, kiedy większość operacji get tyczy się małego podzbioru elementów tej listy
    warto używać, kiedy większość operacji get tyczy się różnych elementów tej listy
    zawsze warto używać, kiedy większość operacji, to operacje get
    warto używać, kiedy większość operacji tyczy się jednego elementu
    warto używać dla losowych danych

    * szukając na liście elementu, trzeba ją całą przeszukiwać od początku, zatem im częściej będziemy szukali elementu (grupy elementów) znajdującego się na początku, tym lepiej dla nas. Wrzucanie wszystkich elementów na początek nam nic nie da, bo średnio i tak będzie dany element w środku.

  5. Wyznaczenie operacji(i) dominującej/ych jest potrzebne do określenia:
    złożoności optymistycznej pamięciowej
    złożoności oczekiwanej pamięciowej
    złożoności oczekiwanej obliczeniowej

    * złożoność pamięciowa raczej nie jest określona przez operacje dominujące. Wyjątkiem są algorytmy rekurencyjne. Biorąc je pod uwagę zaznaczyłbym wszystko.

  6. Wstawiamy do pustego drzewa BST kolejno: 1 0 3 4 6 2 5. Wypisując wartości węzłów przy przejściu drzewa w porządku inorder, otrzymamy:
    0 1 2 3 4 5 6
    0 2 5 6 4 3 1
    0 2 5 6 4 3 1

    * inOrder jest zawsze posortowany

  7. Mamy graf nieskierowany: a--b, b--c, c--a. Wykonujemy na nim DFS z punktu "a" i oznaczamy czasy rozpoczęcia i zakończenia. Notując x (p/f), gdzie x-wierzchołek, p-czas rozpoczęcia, f-czas zakończenia przetwarzania, możemy otrzymać:
    a(0/5), b(1/3), c(2/4)
    a(0/3), b(1/4), c(2/5)
    a(0/5), b(1/2), c(3/4)

    * jak dla mnie a(0,5), b(1,4), c(2,3)

  8. Mamy graf skierowany złożony z wierzchołków {a,b,c,d} i krawędzi a->b, b->c, c->d, d->a.
    pełny
    acykliczny
    spójny
    graph

    * ma cykl, więc nie jest acykliczny i nie jest drzewem. Na graf pełny trochę mu brakuje krawędzi

  9. Mamy graf skierowany złożony z wierzchołków {a,b} i krawędzi a->b, b->a. Jest on:
    pełny
    acykliczny
    spójny
    graph

    * jest pełny i spójny, ma cykl

  10. Mamy graf skierowany złożony z wierzchołków {a} i krawędzi a->a. Jest on:
    pełny
    drzewem
    spójny
    acykliczny
    graph

    * za wiki: Graf pełny jest grafem prostym, w którym dla każdej pary węzłów istnieje krawędź je łącząca. Graf prosty - graf bez pętli i krawędzi wielokrotnych. Zatem nie jest grafem pełnym (ale chyba trzeba jeszcze zajrzeć do wykładu dr Chrzastowskiego)

  11. Mamy graf skierowany złożony z wierzchołków {a,b,c,d} i krawędzi a->b, b->a, c->d, d->c. Jest on:
    spójny
    drzewem
    pełny
    acykliczny
    graph

    * graf jest dwudzielny, więc nie jest spójny, więc nie jest drzewem i tym bardziej nie jest pełny

  12. Listę, ze zmodyfikowaną operacją get, który przesuwa żądany element na koniec listy:
    warto używać, kiedy większość operacji tyczy się jednego elementu
    zawsze warto używać, kiedy większość operacji, to operacje get
    warto używać, kiedy większość operacji get tyczy się różnych elementów tej listy
    warto używać, kiedy większość operacji get tyczy się małego podzbioru elementów tej listy
    warto używać, dla losowych danych

    * Jak w przypadku przesuwania na początek, tyle że na odwrót;) generalnie opłaca się, jesli dzięki temu już nie będziemy musieli przez nie 'przechodzić' przeszukując listę. Dzieje się tak wyłacznie w przypadku, gdy szukamy różnych elementów

  13. Które z niżej wymienionych wymagają co najmniej O(n) dodatkowej pamięci:
    CountSort
    Sortowanie bąbelkowe
    SelectionSort
  14. Porównując (dla danego algorytmu) złożoność pesymistyczną pamięciową z oczekiwaną obliczeniową:
    mogą być sobie równe
    pierwsza jest (zawsze) nie lepsza od drugiej
    pierwsza jest (zawsze) gorsza od drugiej
  15. Porównując (dla danego algorytmu) złożoność pesymistyczną pamięciową z oczekiwaną pamięciową:
    pierwsza jest (zawsze) gorsza od drugiej
    pierwsza jest (zawsze) nie lepsza od drugiej
    pierwsza może być lepsza od drugiej