Tablice haszujące:
Metoda łańcuchowa (te same element jako lista)
Adresacja liniowa (wyznaczenie skoku do kolejnej komórki) jeśli funkcja haszująca wskaże zajęte
pole)
Metoda monte carlo – wyznaczanie pola koła (wpisz koło w kwadrat i strzelaj losowymi punktami z
pp P(koła)/P(kwadratu)
Find Union
GRAFY
BFS, DFS
Algorytm dla grafu napisać i uwaga, pamiętać o podstawowych algorytmach które gdzieś tam pod
spodem działają
Dwuspójne składowe -
Funkcja low wyznacza te same dwuspójne składowe
Inny algorytm: książka – zamiana dwuspójnych składowych na spójne składowe
Zamiana wierzchołków z krawędziami, jeśli graf 2) będzie spójny to graf 1 będzie dwuspójny
Silnie spójne składowe (grafy skierowane) – pomiędzy każdymi wierzchołkami jest
przejście x->y i y->x.
Krawędź wsteczna – łączy dany wierzchołek z jego potomkiem
Krawędź poprzeczna – nie ma żadnej relacji między wierzchołkami
Krawędź w tył – jest relacja potomek przodek
Dowód poprawności:
to oznacza, że nie ma żadnej krawędzi wstecznej która pozwoli nam przeskoczy
v.
Lowback pokazuje, że istnieje krawędź wsteczna V
Low – istnieje krawędź poprzeczna pomiędzy dwoma gałęziami w drzewie przeglądania
Kolorowanie grafu
(planarny)
Liniowo w czasie O(n) a dodatkowo 5 cioma barwami
Algorytmy grafowe:
-Wyznaczanie tras (najkrótszych ścieżek)
Rozproszony równoległy
Switch – separuje ruch sieciowy
Protokół drzewa rozpinającego (STP) zapobieganie zapętleniu, sposób rozproszony
Wyznaczanie drzewa rozpinającego z najmniejszym kosztem
3 algorytmy znajdowania ścieżek: (udowodnij poprawność działania, policz złożoność
(najlepsza implementacja))
1) Dijkstra (prima – dijkstry) (starujemy od danego wierzchołka i wyznaczmy minimalne
drzewo rozpinające) wyznacza ścieżki od danego węzła do każdego innego o
najmniejszym koszcie.
a) minimalne drzewo rozpinające – zbiór krawędzi, które tworzą drzewo z krawędzi
grafu i suma wag krawędzi jest najmniejsza.
2) Kruskal 1956 – (zastanowić się nad implementacją)
tworzymy las węzłów grafu. Każdy węzeł osobne drzewo.
a) wyznaczamy wszystkie krawędzie o najmniejszym koszcie pomiędzy dwoma różnymi
spójnymi składowymi
b) scalamy te wierzchołki i mają wspólnych sąsiadów
Taka krawędź jest bez sensu, bo nie spełnia warunku że łączy dwie różne spójne składowe
Powstało drzewo rozpinające o minimalnym koszcie
W jaki sposób łączyć wierzchołki?? Problem find union O(n^2) lub drzew z kompresją ścieżek
prawie O(n) bo jeszcze logarytm z gwiazdką!
3) Boruvki (krawędzie mają różne wagi (można niby nie))
Wszystkie wierzchołki tworzą niezależne drzewo (tak jak u Kruskala)
Dla każdego wierzchołka wyznacza krawędź która ma minimalną wartość wychodzącą
z wierzchołka
Dlaczego inne?
A chcemy, żeby wybrały tę samą krawędź. Możemy np. ponumerować krawędź
Zadania
Grafika
Podstawowe algorytmy graficzne:
Poprawa algorytmu
Dowolny wielokąt
pq pokrywa się częściowo
ilość przecięć parzysta
a) bok wielokąta pokrywa się z odcinkiem to następne punkty leżą po dwóch różnych stronach
prostej to dodajemy +1 jeśli nie to +0
Otoczka wypukła
najlepsza pesystymiczna złożoność obliczania złożoności otoczki wypukłej
Algorytmy znajdowania otoczky wypukłej:
Algorytm naiwny
Trochę szybszy algorytm:
Potrzebny punkt wewnątrz otoczki wypukłej – bierzemy centroid
Obliczanie kątów!
sinus kąta - konwersja
Funkcja alfa – możemy dzięki niej porównywać kąty ale uwaga wartości funkcji nie są wartościami
kątów !!
Algo do otoczki wypukłej
Algorytm Grahama – potrzebuje punktu w środku
Centroid potrzebny
1) Należy posortować wierzchołki Nlogn, jeśli ma dwa punkty o tym samym kącie to sortujemy
ze względu na odległość od punktu i bierzemy bliższy
2) Bierzemy 3 punkty i sprawdzamy czy środkowy należy do trójkąta, jeśli tak to wyrzucamy z
otoczki
Jeśli jest to usuwamy i bierzemy następny. Jeśli nie to zostawiamy
Złożoność czasowa:
1) Wyznaczenie centroidu O(n)
2) Posortowanie punktów ze wzgl na kąt O(1+nlogn) stosując funkcję alfa
3) Koszty przejścia:
a) Przesunięcie o 1 pozycje
b) usunięcie 1 -go wierzchołka
O(n)
Ostatecznie O(nlogn)
Algorym Jarisa (inaczej algorytm zawijania)
1) Zespół puntków – należy znaleźć otoczkę
2) Bierzemy punkt który jest najniżej wzgl współrzędnych Y
3) I mamy promienie wodzące do reszty punków
4) Wyznacz next punkt – taki o najmniejeszym kącie, jeśli jest kilka bierzemy najbardziej
odległy
5) Dalej przechodzimy do nowego punktu wyznaczonego i to samo robimy
Nawijamy punkty na tę łamaną
sample 2
Policzyć jaka złożoność! Uwzględnić struktury
Dziel i zwyciężaj
1) Dla trzech punktów oczywiste (trójkąt)
2) Posortujmy punkty ze wzgl na wsprółrzędną X
3) Podzielmy je na 2 części
4) Wyznaczamy mniejsze obwiednie wypukłe
5) Bierzemy najbardziej prawy punkt dla lewej obwiedni i szukamy dla każdego punktu z drugiej
obwiedni wektora o największym i najmniejszym kącie
6) Zaznaczone punkty będą na otocze wypukłej
7) Startujemy z zaznaczonych punktów i wyznaczmy najmniejszy kąt wychodzący ze
znalezionych punktów
8) Następnie to samo
9) Robiąc tak w kółko zrobimy obwiednię
Struktury + złożoność !!
Algorytm przyrostowy
1) Podobnie jak poprzednio, sortujemy wzgl wspórzędnej X
2) Bierzemy 3 punkty
3) Potem bierzemy kolejny o najmnieszej wspórzędnej x – owej
4) Patrzymy jak on ma się kątowo do pozostałych
5) Najbardziej odległy o najmniejszym kącie będzie należał do nowej otoczki i o największym
także
Struktury i złożoność!!
Technika zamiatania (studentów z zaliczenia)
1) Z punktów na płaszczyźnie wybrać 2 najbliższe
w kwadracie delta min max 4 pkt z zasady szufladkowej
2)
3) Rozpatrujemy tylko te punkty które są w odległości delta min od miotły
4)
Struktury danych:
Potrzebujmy 4 elemeny mniejsze i 4 większe ale jak wiadomo w AVL możemy w czasie O(logn)
taką operację wykonać
Złożoność czasowa:
1) Modyfikacja strefy aktywnej O(n)
2) Drzewo AVL dla aktywnej strefy O(logn) wstawienie i kasowanie, znajdowanie mniejszych /
większych O(logn) w sumie O(logn) ale sumarcznych zatrzymań n więc O(nlogn)
Cały algorytm w czasie O(nlogn)
poprawność + czas działania
Dowód przez indukcję strukturalną