@@ -35,10 +35,20 @@ int h(int x, int m, int i){
|
|||||||
int h_kw(int x, int m, int i){
|
int h_kw(int x, int m, int i){
|
||||||
g_counter++;
|
g_counter++;
|
||||||
int formula = ((x % m) + (2 * i * i) - (5*i)) % m;
|
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 A tablica mieszajaca
|
||||||
@param m rozmiar tablicy mieszajacej
|
@param m rozmiar tablicy mieszajacej
|
||||||
@param x element wstawiany do tablicy
|
@param x element wstawiany do tablicy
|
||||||
@@ -91,6 +101,28 @@ bool hash_al_szukaj_kw(int * A, int m, int x){
|
|||||||
return false;
|
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()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -172,7 +204,7 @@ int main()
|
|||||||
std::cerr << "Ilość wywołań funkcji wstawiającej: " << g_counter << "\n";
|
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).
|
// 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.
|
//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++)
|
for (int i = 0; i < m ; i++)
|
||||||
{
|
{
|
||||||
tab[i] = EMPTY;
|
tab[i] = EMPTY;
|
||||||
@@ -201,7 +233,7 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cerr << std::endl;
|
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++)
|
for (int i = 0; i < m ; i++)
|
||||||
{
|
{
|
||||||
tab[i] = EMPTY;
|
tab[i] = EMPTY;
|
||||||
@@ -236,7 +268,7 @@ int main()
|
|||||||
std::cerr<<std::endl;
|
std::cerr<<std::endl;
|
||||||
std::cerr<<std::endl;
|
std::cerr<<std::endl;
|
||||||
std::cerr<<std::endl;
|
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++)
|
for (int i = 0; i < m ; i++)
|
||||||
{
|
{
|
||||||
tab[i] = EMPTY;
|
tab[i] = EMPTY;
|
||||||
@@ -265,7 +297,7 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::cerr << std::endl;
|
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++)
|
for (int i = 0; i < m ; i++)
|
||||||
{
|
{
|
||||||
tab[i] = EMPTY;
|
tab[i] = EMPTY;
|
||||||
@@ -297,5 +329,66 @@ int main()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cerr<<std::endl;
|
||||||
|
std::cerr<<std::endl;
|
||||||
|
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 wstawiania podwójnego dla " << range*100 << "%\n";
|
||||||
|
auto start = std::chrono::high_resolution_clock::now();
|
||||||
|
for (int i = range*m; i < (range*m)+10000; i++) {
|
||||||
|
hash_al_wstaw_d(tab, m, dane[i]);
|
||||||
|
}
|
||||||
|
auto stop = std::chrono::high_resolution_clock::now();
|
||||||
|
std::chrono::duration<double, std::micro> 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<double, std::micro> czas = stop - start;
|
||||||
|
std::cerr << "Uplynelo: " << czas.count() << " us\n";
|
||||||
|
std::cerr << "Ilość wywołań funkcji szukającej: " << g_counter << "\n";
|
||||||
|
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user