From 4b448cfaac7723f4701cd112ab9e8ce9013ba00d Mon Sep 17 00:00:00 2001 From: VectorKappa Date: Wed, 26 Apr 2023 14:25:11 +0200 Subject: [PATCH] Zadanie 1&2 z Projektu 2 --- projekt 2/Makefile | 8 +++ projekt 2/main.cpp | 128 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 projekt 2/Makefile create mode 100644 projekt 2/main.cpp diff --git a/projekt 2/Makefile b/projekt 2/Makefile new file mode 100644 index 0000000..1a1cd8f --- /dev/null +++ b/projekt 2/Makefile @@ -0,0 +1,8 @@ +build: + ccache g++ main.cpp + +run: + ccache g++ main.cpp -O3 ; ./a.out + +clean: + rm -f ./a.out diff --git a/projekt 2/main.cpp b/projekt 2/main.cpp new file mode 100644 index 0000000..57ab549 --- /dev/null +++ b/projekt 2/main.cpp @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include + +//#include +//#include +//#include +//#include +//#include +//#include + +#define EMPTY -1 // puste miejsce w tablicy mieszajacej +#define REMOVED -2 // puste miejsce tablicy mieszajacej z ktorego usuniety zostal jakis element + +//Zad. 1 Wstawianie do tablicy mieszajacej (adresowanie liniowe) + +/** Funkcja mieszająca wykorzystująca adresowanie liniowe +@param x element dla którego obliczamy wartość funkcji mieszającej +@param m rozmiar tablicy do której wstawiamy (parametr funki mieszajacej) +@param i która to próba wstawienia/które obliczenie funkcji mieszającej (parametr funki mieszajacej) +@return wartość f. mieszającej, pod ten indeks próbujemy wstawić potem x +*/ +int h(int x, int m, int i){ + if (i==0) { + return x % m; + } else { + return (x % m + i) % m; + } +}; + +/** Funkcja wstawiajaca jeden element x do tablicy mieszajacej tab o rozmiarze m + @param A tablica mieszajaca + @param m rozmiar tablicy mieszajacej + @param x element wstawiany do tablicy + @return true, jesli element zostal wstawiony; false, jesli nie udalo sie wstawic elementu (brak miejsca w tablicy) + */ +bool hash_al_wstaw(int * A, int m, int x) +{ + // Zaimplementuj + //... + for (int i = 0; i < m-1; i++) { + int k = h(x, m, i); + if (A[k] == EMPTY || A[k] == REMOVED){ + A[k]=x; + return true; + } + } + return false; +} + + +int main() +{ + std::cout << "Zadanie 1 i 2:\n"; + // Zad. 2 (rozgrzewka + test) + const int m1 = 8; //rozmiar tablicy mieszajacej + int t[m1]; //tablica mieszajaca + // Wyczyszczenie tablicy mieszajacej t (Wypelnienie pustymi miejscami) + for (int i = 0; i < m1; i++) + { + t[i] = EMPTY; + } + + // Wstawianie elementów do tablicy mieszajacej t (uzyć funkcji hash_al_wstaw) + for(int x : {8,6,18,11,3,32,19,27}) + { + hash_al_wstaw(t, m1, x); + } + // ... + + + // Wyswietlenie tablicy mieszajacej t o rozmiarze m1 + std::cout << std::setw(7) << "indeks:"; + for (int i = 0; i < m1; i++) + { + std::cout << std::setw(11) << i; + } + std::cout << std::endl; + std::cout << std::setw(8) << "|"; + for (int i = 0; i < m1; i++) + { + std::cout << std::setw(10) << t[i] << "|" ; + } + std::cout << std::endl; + + + // Zad. 3 Pomiary + + std::cout << "\nZadanie 3:\n"; + // a) Tablica z danymi + // Tworzenie tablicy dane z danymi do wstawinia do tablicy mieszajacej + int rozm_dane = 20000000; //liczba elementow w tablicy dane + int* dane = new int[rozm_dane]; + //wypelnienie tablicy dane kolejnymi liczbami od 0 do rozm_dane-1 + for (int i = 0;i < rozm_dane;i++) + { + dane[i] = i; + } + std::random_device rd; + std::mt19937 g(rd()); + std::shuffle(dane, dane + rozm_dane, g); //losowa permutacja elementow w tablicy dane (wymieszanie tablicy) + + + // b) Tablica mieszajaca + // Utworz pusta tablice mieszajaca tab o rozmiarze m = 2097152 (2 do potegi 21) + const int m = 2097152; + // int * tab = ...; + // ... + + // c) Wstaw 10000 elemetow z tablicy dane do pustej tablicy mieszajacej tab (zapelnienie 0%). Na tej podstawie zmierz sredni czas wstawiania elementu oraz srednią liczbe wywolan funkcji mieszajacej przy wstawianiu elementu do pustej tablicy. + + std::cout << "Pomiary:\n"; + // Mierzenie czasu, przyklad: + auto start = std::chrono::high_resolution_clock::now(); + //tutaj mierzona operacja + auto stop = std::chrono::high_resolution_clock::now(); + std::chrono::duration czas = stop - start; + std::cerr << "Uplynelo: " << czas.count() << " us\n"; + + // d) Zmierz sredni czas wstawiania elementu oraz srednią liczbe wywolan funkcji mieszajacej przy wstawianiu elementu do tablicy wypelnionej w 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% (dla próbki: 10000 elementów). + //UWAGA! Do tablicy mieszajacej nie wstawiac elementow, ktore juz w niej sa. + + //... + + return 0; +}