diff --git a/projekt 2/main.cpp b/projekt 2/main.cpp index c24a19e..0080218 100644 --- a/projekt 2/main.cpp +++ b/projekt 2/main.cpp @@ -35,10 +35,20 @@ int h(int x, int m, int i){ int h_kw(int x, int m, int i){ g_counter++; int formula = ((x % m) + (2 * i * i) - (5*i)) % m; - return (formula<0) ? m+formula : formula; + return (formula<0) ? (m+formula)%m : formula; }; -/** Funkcja wstawiajaca jeden element x do tablicy mieszajacej tab o rozmiarze m +int h_d(int x, int m, int i){ + g_counter++; + int formula = ((x % m) + i*((((x/m)%(m/2))*2) + 1))%m; + return formula; +}; +/* + *h(x, i, m) = (h1(x, m) + i*(h2(x, m)) mod m dla: i = 0, 1, 2, . . . , m − 1, + h1(x, m) = x mod m, + h2(x, m) = (((x/m) mod (m/2)) * 2) + 1. + * +** 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 @@ -91,6 +101,28 @@ bool hash_al_szukaj_kw(int * A, int m, int x){ return false; } +bool hash_al_wstaw_d(int * A, int m, int x) +{ + // Zaimplementuj + //... + for (int i = 0; i < m-1; i++) { + int k = h_d(x, m, i); + if (A[k] == EMPTY || A[k] == REMOVED){ + A[k]=x; + return true; + } + } + return false; +} + +bool hash_al_szukaj_d(int * A, int m, int x){ + for (int i = 0; i < m; i++) { + int k = h_d(x, m, i); + if (A[k] == x){ return true;} + if (A[k] == EMPTY){ return false;} + } + return false; + } int main() { @@ -172,7 +204,7 @@ int main() std::cerr << "Ilość wywołań funkcji wstawiającej: " << g_counter << "\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. - for(double range : {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}){ + for(double range : {0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}){ for (int i = 0; i < m ; i++) { tab[i] = EMPTY; @@ -201,7 +233,7 @@ int main() } std::cerr << std::endl; - for(double range : {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}){ + for(double range : {0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}){ for (int i = 0; i < m ; i++) { tab[i] = EMPTY; @@ -236,7 +268,7 @@ int main() std::cerr< czas = stop - start; + std::cerr << "Uplynelo: " << czas.count() << " us\n"; + std::cerr << "Ilość wywołań funkcji wstawiającej: " << g_counter << "\n"; + + + + } + + std::cerr << std::endl; + for(double range : {0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}){ + for (int i = 0; i < m ; i++) + { + tab[i] = EMPTY; + } + + g_counter = 0; + for (int i = 0; i < range*m; i++) { + hash_al_wstaw_d(tab, m, dane[i]); + } + + + g_counter = 0; + // Mierzenie czasu, przyklad: + std::cerr << "Pomiar wyszukiwania podwójnego dla " << range*100 << "%\n"; + int idx=0; + int krok = (range*m)/10000; + auto start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < 10000; i++) { + hash_al_szukaj_d(tab, m, dane[idx]); + idx = idx+krok; + + } + auto stop = std::chrono::high_resolution_clock::now(); + std::chrono::duration czas = stop - start; + std::cerr << "Uplynelo: " << czas.count() << " us\n"; + std::cerr << "Ilość wywołań funkcji szukającej: " << g_counter << "\n"; + + } return 0; }