---
# System prepended metadata

title: Algorytmy i struktury danych II - projekt

---

---
title: 'Algorytmy i struktury danych II - projekt'
disqus: hackmd

---

# Algorytmy i struktury danych II - projekt



## Spis treści

[TOC]

## Skład grupy

1. Dominik Dylewski :pouting_cat: 
2. Paweł Charysz :scream_cat: 
3. Natalia Rutkowska :smile_cat: 
4. Urszula Wróblewska :cat:




## Uruchamianie programu 

Do uruchomienia programu potrzebujemy komputera z systemem operacyjnym Windows oraz zainstalowaną biblioteką [graphviz](https://graphviz.org/documentation/).




# Dokumentacja

### Klasa Graph
Podstawowe metody obłsugujące graf.
Kontynuacja tej klasy(jasność punktów, strażnicy oraz ich harmonogram) znajduje się [tutaj](#Harmonogram-pracy-strażników).
Kontynuacja tej klasy(zastosowanie algorytmu Edmondsa-Karpa) znajduje się [tutaj](#Maksymalny-przep%C5%82yw).

#### Atrybuty
* `int n`
Liczba wierzchołków w grafie

* `std::vector<Vertex> v`
Wektor zawierający wszystkie wierzchołki grafu (obiekty klasy Vertex) .

* `int factory`
Identyfikator wierzchołka w którym znajduje się fabryka.

* `std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, queueComparator> guards`
Kolejka priorytetowa par typu `int` opisująca dostępnych strażników. Jest ona sortowana za pomocą komparatora `queueComparator`.
Składa się z:
    * `int ` 
    Identyfikator danego strażnika.
    * `int` 
    Energia danego strażnika.
    
* `struct queueComparator`
Komparator do kolejki `guards` sortujący ją malejąco po energii poszczególnych strażników.

#### Metody

* `int getFactoryId()`
Metoda zwraca ID wierzchołka, który jest fabryką.

* `void generateGraph()`
Metoda generuje graf. Dla czytelności przykładowego grafu zakładamy że dla każdego wierzchołka generowane jest maksymalnie 5 krawędzi z niego wychodzących.

* `void fixGeneratedGraph()`
Metoda sprawdza czy z fabryki można dojść do każdego wierzchołka w grafie, a jeśli nie to łączy niedostępne wierzchołki (wcześniej pogrupowane by zminimalizować ilość krawędzi) z fabryką.

* `void dfsForFix(int id, int groupid)`
Metoda używana przez `fixGeneratedGraph()` wyszukująca w grafie wszystkie wierzchołki do których można dojść z wierzchołka z podanym `id` i przypisuje im podane `groupid`.

    Jako argumenty metoda przyjmuje liczbę całkowitą `id` identyfikującą wierzchołek oraz liczbę całkowitą `groupid`, która identyfikuje grupę, do której należy wierzchołek.

* `int ifConnected()`
Metoda używana przez `fixGeneratedGraph()` szukająca wśród wierzchołków pierwszego który nie jest przydzielony do żadnej grupy (jego `groupid` jest równe 0) i zwracająca jego `id`.

* `void outputGraph()`
Metoda wyświetla graf na ekran.

* `void inputGraph()`
Metoda pozwala ręcznie wprowadzić graf.

* `std::vector<Vertex> getV()`
Metoda zwraca wektor obiektów typu `Vertex`, który jest zbiorem wierzchołków w grafie.
    Więcej o klasie `Vertex` znajduje się [tutaj](#Klasa-Vertex).
    
* `void drawGraph()`
Metoda jest odpowiedzialna za rysowanie grafu w formacie DOT i zapisanie go do pliku *rysunek.dot*, a następnie, za pomocą narzędzia Graphviz, generowany jest plik graficzny *rysunek.png*, który jest otwierany automatycznie.

### Klasa Vertex
Klasa przechowująca informacje o wierzchołkach.

#### Atrybuty

* `int id`
Unikalny identyfikator wierzchołka.

* `int groupid`
Identyfikator grupy, do której należy wierzchołek (potrzebne do metody `fixGeneratedGraph` w klasie `Graph`).

* `bool isLeader`
Wskazuje, czy wierzchołek jest liderem w swojej grupie.

* `float x`
Współrzędna x wierzchołka.

* `float y`
Współrzędna y wierzchołka.

* `int brightness`
Reprezentuje poziom jasności związany z wierzchołkiem.

* `std::vector<std::tuple<int, float, float>> edges`
Wektor zawierający krotki, z których każda reprezentuje krawędź wierzchołka. Składa się z:
    * `int ` 
    ID połączonego wierzchołka.
    * `float` 
    Maksymalny przepływ krawędzi.
    * `float`
    Aktualny przepływ krawędzi.
    
#### Metody
* `void setCoords(float x, float y)`
Ustawia współrzędne x i y wierzchołka.

    Jako argument przyjmuje`float x` oraz `float y`, które są kolejno współrzędną x oraz y.

* `std::vector<std::tuple<int, float, float>>* getEdges()` 
Zwraca wskaźnik do wektora krawędzi połączonych z wierzchołkiem.
 
* `float getx()`
Zwraca współrzędną x wierzchołka.
 
* `float gety()`
Zwraca współrzędną y wierzchołka.

* `int getid()`
Zwraca id wierzchołka.

* `bool getIsLeader()`
Sprawdza czy wierzchołek jest liderem.

* `int getGroupid()`
Zwraca ID grupy wierzchołka.

* `int getBrightness()`
Zwraca poziom jasności wierzchołka.

* `void setid(int id)`
Ustawia ID wierzchołka.

    Jako argument przyjmuje `int id`, które jest nowym ID wierzchołka.

* `void setGroupid(int groupid)`
Ustawia ID grupy wierzchołka.

    Jako argument przyjmuje `int groupid`, które jest nowym ID grupy wierzchołka.

* `void setIsLeader(bool isLeader)`
Ustawia status lidera wierzchołka.

    Jako argument przyjmuje `bool isLeader`, które jest nowym statusem lidera.

* `void setBrightness(int brightness)`
Ustawia poziom jasności wierzchołka.

    Jako argument przyjmuje `int brightness`, które reprezentuje poziom jasności związany z wierzchołkiem.

## Tragarze

### Klasa Pairs

#### Atrybuty

* `std::vector <Carrier> carriers`
Wektor zawiera obiekty klasy `Carrier`, które reprezentują tragarzy.

* `int r`
Liczba tragarzy z rękami skierowanymi w prawo.

* `int l`
Liczba tragarzy z rękami skierowanymi w lewo.

#### Metody

* `void generatePairs()`
Generuje tragarzy oraz to, który kogo lubi, pytając się użytkownika o ilość praworęcznych i leworęcznych tragarzy.

* `void inputPairs()`
Wczytuje pary tragarzy.

* `void outputPairs()`
Wypisuje pary tragarzy.

* `void connectingPairs()`
Łączy w pary tragarzy.

* `float maximumFlow(int factory, int endnodeId, std::vector<Vertex>* v, std::vector<std::pair<int, int>>* examplePairs)`
Oblicza i zwraca maksymalny przepływ w grafie od wierzchołka reprezentującego fabrykę do wierzchołka reprezentującego końcowy punkt. Składa się z:
    * `int factory`
    ID wierzchołka reprezentującego fabrykę.
    * `int endnodeId`
    ID wierzchołka reprezentującego końcowy punkt.
    * `std::vector<Vertex>* v`
    Wskaźnik do wektora wierzchołków grafu.
    * `std::vector<std::pair<int, int>>* examplePairs`
    Wskaźnik do wektora par tragarzy.
    
* `std::vector<Vertex> getShortestPathBFS(int factory, int endnode, std::vector<Vertex>* v)`
Znajduje i zwraca najkrótszą ścieżkę w grafie od wierzchołka reprezentującego fabrykę do wierzchołka reprezentującego punkt końcowy, korzystająć z algorytmu BFS (Breadth-First Search). Składa się z:
    * `int factory`
    ID wierzchołka reprezentującego fabrykę.
    * `int endnode`
    ID wierzchołka reprezentującego końcowy punkt.
    * `std::vector<Vertex>* v`
    Wskaźnik do wektora wierzchołków grafu.


### Klasa Carrier
Klasa przechowująca informacje o tragarzach.

#### Atrybuty

* `int id` 
Identyfikator tragarza.

* `int numberOfLikes`
Liczba tragarzy, których lubi dany tragarz.

* `std::vector<int> likes`
Wektor `int`, gdzie każda para składa się z identyfikatora tragarza, którego lubi dany tragarz.

#### Metody

* `std::vector<int>* getLikes()`
Zwraca wskaźnik do wektora par reprezentujących tragarzy lubianych przez danego tragarza.

* `void setid(int id)`
Ustawia identyfikator tragarza.

    Jako argument przyjmuje `int id`, który jest identyfikatorem tragarza.

* `void setNumberOfLikes(int l)`
Ustawia liczbę tragarzy, których lubi dany tragarz.

    Jako argument przyjmyje `int l`, który jest liczbą tragarzy lubianych przez danego tragarza.

* `int getid()`
Zwraca identyfikator tragarza.

* `int getNumberOfLike()`
Zwraca liczbę tragarzy, których lubi dany tragarz.

## Otoczka wypukła
Do utworzenia otoczki wypukłej został użyty algorytm Jarvisa. 

### Klasa ConvexHull
Klasa służy do tworzenia otoczki wypukłej oraz obliczania jej obwodu.

#### Metody
* `std::vector<Vertex> calculateConvexHull(std::vector<Vertex> v)`
Metoda służy do obliczenia otoczki wypukłej.

    Jako argument przyjmuje wektor obiektów typu `Vertex`, które reprezentują punkty w przestrzeni dwuwymiarowej.
    
    Zwraca wektor obiektów `Vertex`, które tworzą otoczkę wypukłą.


*  `float crossProduct(Vertex p, Vertex q, Vertex r)`
Metoda oblicza iloczyn wektorowy trzech punktów(p, q, r). Zostaje to wykorzystane w metodzie `calculateConvexHull`.

    Jako argument przyjmuje trzy obiekty klasy `Vertex` będące punktami w przestrzeni dwuwymiarowej.

    Zwraca:

    * 0 - iloczyn wektorowy wynosi 0, punkty p, q, r są wspóliniowe
    * 1 - iloczyn wektorowy jest dodatni, punkt r leży po lewej stronie odcinka pq
    * 2 - iloczyn wektorowy jest ujemny, punkt r leży po prawej stronie odcinka pq

*  `float perimeter(std::vector<Vertex>& v)`

    Metoda służy do obliczenia obwodu otoczki wypukłej.

    Jako argument metoda przyjmuje wektor obiektów `Vertex`, które tworzą otoczkę wypukłą.
    
    Zwraca obwód otoczki wypukłej.
* `float distance(Vertex p, Vertex q)`
Metoda służy do obliczania długości odcinka pq.

    Jako argument metoda przyjmuje dwa obiekty typu `Vertex`.
    
    Zwraca długość odcinka pq.

## Maksymalny przepływ
Do znalezienia maksymalnego przepływu między fabryką a punktem budowy płotu został użyty algorytm Edmondsa-Karpa.

### Klasa Graph
Kontynuacja tej klasy(podstawowe metody) znajduje się [tutaj](#Klasa-Graph).
Kontynuacja tej klasy(jasność punktów, straznicy oraz ich harmonogram) znajduje się [tutaj](#Harmonogram-pracy-strażników).

#### Atrybuty
* `std::vector<Vertex> v`
Wektor przechowujący zbiór wierzchołków grafu.

* `int factory`
Przechowuje identyfikator wierzchołka, który jest fabryką.


#### Metody
* `std::vector<Vertex> getShortestPathBFS(int endnode)`
Metoda znajduje najkrótszą drogę między fabryką a punktem `endnode`.

    Jako argument metoda przyjmuje liczbę całkowitą `endnode`, która jest identyfikatorem wierzchołka docelowego.
    
    Zwraca wektor obiektów typu `Vertex` zawierający wszystkie punkty na znalezionej drodze.
    Więcej o klasie `Vertex` znajduje się [tutaj](#Klasa-Vertex).
 
* `float maximumFlow(int endnodeId)`
Metoda oblicza maksymalny przepływ między fabryką a punktem na otoczce.

    Jako argument metoda przyjmuje liczbę całkowitą `endondeId`, która jest identyfikatorem wierzchołka docelowego.
    
    Zwraca liczbę zmiennoprzecinkową reprezentującą maksymalny przepływ między fabryką a punktem o identyfikatorze `endnode`. Jeśli nie ma dojścia do `endnode` zwracana jest wartość 0.

* `void flowCleaner()`
Metoda zeruje aktualny przepływ na wszystkich krawędziach.

## Harmonogram pracy strażników
Tworzenie oraz wyświetlanie tygodniowego harmonogramu pracy strażników.

### Klasa Graph
Kontynuacja tej klasy(podstawowe metody) znajduje się [tutaj](#Klasa-Graph).
Kontynuacja tej klasy(zastosowanie algorytmu Edmondsa-Karpa) znajduje się [tutaj](#Maksymalny-przep%C5%82yw).

#### Metody
* `void guardShedule(std::vector<Vertex> convexHull)`
Metoda tworzy oraz wyświetla harmonogram pracy strażników.

    Jako argument metoda przyjmuje wektor obiektów typu `Vertex`, który zawiera punkty znajdujące się na otoczce.
    Więcej o klasie `Vertex` znajduje się [tutaj](#Klasa-Vertex).
    
* `void generateBrightness(std::vector<Vertex>* convexHull)`
Metoda generuje poziom jasności dla każdego punktu znajdującego się na otoczce.

    Jako argument metoda przyjmuje wskaźnik na wektor obiektów typu `Vertex`, który zawiera punkty znajdujące się na otoczce.
    Więcej o klasie `Vertex` znajduje się [tutaj](#Klasa-Vertex).

* `void inputBrightness(std::vector<Vertex>* convexHull)`
Metoda pozwala ręcznie wprowadzić jasność dla każdego punktu znajdującego się na otoczce.

    Jako argument metoda przyjmuje wskaźnik na wektor obiektów typu `Vertex` , który zawiera punkty znajdujące się na otoczce.
    Więcej o klasie `Vertex` znajduje się [tutaj](#Klasa-Vertex).


* `void generateGuards(int maxSize)`
Metoda generuje 20 strażników wraz z ich energią.

    Jako argument metoda przyjmuje liczbę całkowitą `maxSize`, która określa maksymalną wartość energii strażników ().

* `void inputGuards()`
Metoda pozwala ręcznie wprowadzić strażników wraz z ich energią.

* `void outputGuards()`
Metoda wypisuje na ekran wszystkich strażników wraz z ich energią.



## Melodia
Generowanie, wyświetlanie oraz ustawianie melodii.

### Klasa Melody
Kontynuacja tej klasy(zastosowanie algorytmu Huffmana) znajduje się [tutaj](#Algorytm-Huffmana).
#### Atrybuty
* `std::string s`
Przechowuje melodię.

* `int sSize`
Długość melodii.

#### Metody
* `void generateMelody(int len)`
Metoda generuje losową melodię o długości `len`.

    Jako argument przyjmuje liczbę całkowitą `len`, która określa długość generowanej melodii.


* `void outputMelody()`
Metoda wypisuje melodię.

* `void setMelody(std::string s)`
Metoda ustawia melodię.

    Jako argument przyjmuje `string s`, który reprezentuje melodię.
    
* `std::string getMelody()`
Metoda zwraca `string`, który reprezentuje melodię.
## Algorytm Huffmana
### Klasa Melody
Kontynuacja tej klasy(generowanie melodii) znajduje się [tutaj](#Melodia).
#### Atrybuty
* `std::string encrypted`
Przechowuje zaszyfrowaną melodię.

* `std::string decrypted`
Przechowuje odszyfrowaną melodię.

* `TreeNode* root`
Wskaźnik na korzeń drzewa Huffmana. 
Więcej o klasie `TreeNode` znajduje się [tutaj](#Klasa-TreeNode).
* `std::map<char, std::string> mp`
Mapa do kodowania Huffmana, przechowuje kodowanie liter.

* `std::string mapTemp = ""`
Pomocniczy `string` do tworzenia kodów dla liter podczas budowania mapy Huffmana.
#### Metody
* `void outputEncryptedMelody()`
Metoda wypisuje zaszyfrowaną melodię.

* `void outputDecryptedMelody()`
Metoda wypisuje odszyfrowaną melodię.

* `void encryptHuffman()`
Metoda szyfruje melodię algorytmem Huffmana. Tworzy drzewo Huffmana na podstawie częstości występowania liter w melodii, tworzy mapę na podstawie tego drzewa, a następnie generuje zakodowaną melodię używając tej mapy.
* `void decryptHuffman()`
Metoda odszyfrowuje zaszyfrowaną melodię algorytmem Huffmana.
Używa drzewa Huffmana do konwersji zaszyfrowanej melodii z powrotem na oryginalną melodię.
* `void makeHuffmanMap(TreeNode* temp)`
Metoda pomocnicza wywoływana przez `encryptHuffman()` tworząca mapę zawierającą Huffmana.

    Jako argument przyjmuje wskaźnik na obecnie przetwarzany węzeł Huffmana.
    Więcej o klasie `TreeNode` znajduje się [tutaj](#Klasa-TreeNode).
* `void deleteHuffmanTree(TreeNode* del)`
Metoda do usuwania drzewa Huffmana.

    Jako argument przyjmuje wskaźnik na obecnie usuwany węzeł drzewa Huffmana.
    Więcej o klasie `TreeNode` znajduje się [tutaj](#Klasa-TreeNode).

* `~Melody()`
Destruktor klasy Melody. Usuwa drzewo Huffmana zwalniając zajmowaną przez nie pamięć.
### Klasa TreeNode
Klasa pomocnicza służąca do tworzenia węzłów drzewa Huffmana.
#### Atrybuty
* `TreeNode* left`
Wskaźnik na lewe dziecko węzła.

* `TreeNode* right`
Wskaźnik na prawe dziecko węzła.
* `char c`
Przechowuje literę, którą reprezentuje dany węzeł lub '-' jeśli to węzeł wewnętrzny.
* `int n`
Liczba wystąpień litery przechowywanej w węźle.
#### Metody
* `TreeNode* getLeft()`
Metoda zwraca wskaźnik na lewe dziecko węzła.

* `TreeNode* getRight()`
Metoda zwraca wskaźnik na prawe dziecko węzła.

* `char getc()`
Metoda zwraca literę przechowywaną w węźle.

* `int getn()`
Metoda zwraca liczbę wystąpień litery przechowywanej w węźle.
* `void setLeft(TreeNode* left)`
Metoda ustawia wskaźnik na lewe dziecko węzła.
    
    Jako argument przyjmuje wskaźnik na lewe dziecko węzła.
* `void setRight(TreeNode* right)`
Metoda ustawia wskaźnik na prawe dziecko węzła.
    
    Jako argument przyjmuje wskaźnik na prawe dziecko węzła.
* `void setc(char c)`
Metoda ustawia literę przechowywaną w węźle.

    Jako argument przyjmuje literę przechowywaną w węźle.
* `void setn(int n)`
Metoda ustawia liczbę wystąpień litery przechowywanej w węźle.
    
    Jako argument przyjmuje liczbę wystąpień litery przechowywanej w węźle.

## Wyszukiwanie wzorca w tekście
By wyszukać wzorzec w tekście został użyty algorytm Boyera-Moore'a.
Obsługiwane są tylko małe litery alfabetu angielskiego.
### Klasa PatternSearching
Służy do wyszukiwania wzorca w tekście.
#### Atrybuty
* `std::string pattern`
 Przechowuje wzorzec, który ma być wyszukiwany.
 
* `std::vector<int> last`
Wektor przechowujący ostatnie położenie każdego znaku alfabetu we wzorcu.

*  `std::vector<int> bmnext`
Wektor zawierający wartości przesunięć dla poszczególnych sufiksów wzorca.
#### Metody
* `void fillLast()`
Metoda wypełnia wektor 'last', który przechowuje ostatnie położenie każdego znaku wzorca.

* `void fillBMNext()`
Metoda wypełnia wektor bmnext, który jest wykorzystywany do obliczania przesunięć wzorca.
* `void setPattern(const std::string& pat)`
Metoda ustawia wzorzec do wyszukiwania i inicjalizuje struktury pomocnicze: `fillLast()` oraz `fillBMNext()`.

    Jako argument przyjmuje wzorzec, który ma byc wyszukany.

* `std::vector<int> search(const std::string& text)`
Metoda wyszukuje wzorzec w podanym tekście.

    Jako argument przyjmuje tekst, w którym ma wyszukać wzorzec.

    Zwraca wektor zawierający wszystkie indeksy pierwszych liter wystąpień wzorca w tekście.

### Zamiana wzorca
Aby podmienić wzorzec na inny należy wykonać następujące kroki.

Ustawienie wzorca, który będzie wyszukiwany w tekście.
```cpp
std::string pattern = "abc";
ps.setPattern(pattern);
```

Wyszukiwanie wzorca w tekście.
```cpp
std::string text = "abctextabc";
std::vector<int> result = ps.search(text);
```
Zamiana wzorca.
```cpp
if (!result.empty())
{
    std::string newPattern = "xyz";
    for (int i = 0; i < result.size(); i++)
    {
        for (int j = 0; j < pattern.size(); j++)
        {
            text[result[i] + j] = newPattern[j];
        }
    }
}
```
