
Добавил:
eeeikh
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:main
.cpp#include <iostream>
using namespace std;
int HashTable[100];
void Generator(int numbers[],int M)
{
bool alreadyThere;
for (int i = 0;i < M;)
{
alreadyThere = false;
int newRandomValue = rand() % 90+10;
for (int j = 0;j < i;j++)
{
if (numbers[j] == newRandomValue)
{
alreadyThere = true;
break;
}
}
if (!alreadyThere)
{
numbers[i] = newRandomValue;
i++;
}
}
}
void print(int numbers[],int M)
{
for (int i = 0;i < 13;i++)
{
for (int j = i;j < M;j += 13)
{
cout << j + 1 << ") " << numbers[j] << "\t";
}
cout << endl;
}
}
int hashFunction(int x)
{
int a;
a = x * x % 100/10;
return a;
}
void generateHT(int numbers[],int M)
{
for (int i = 0;i < M;i++)
{
HashTable[hashFunction(numbers[i])] = numbers[i];
}
}
void hashing(int numbers[],int M,int ht[][15])
{
int j = 0;
int i = 0;
for (;i < M;)
{
int a0 = hashFunction(numbers[i]);
j = 0;
if (ht[a0][j] == 0)
{
ht[a0][j] = numbers[i];
i++;
}
else
{
while (ht[a0][j] != 0)
j++;
ht[a0][j] = numbers[i];
i++;
}
}
}
double b(int t,int ht[][15],int M)
{
int k1 = 0;
double b = 0;
for (int i = 0;i < t;i++)
{
int k1 = 0;
for (int j = 0;j < 15;)
{
while (ht[i][j] != 0)
{
k1 = k1 + j + 1;
j++;
}
if (ht[i][j] == 0)
break;
}
b += k1;
}
b = b / M;
return b;
}
bool search(int x,int M,int ht[][15])//поиск
{
int index = hashFunction(x);
bool searched=false;
for (int i = 0;i < M / 3;i++)
{
for (int j = 0;j < 15;j++)
{
if (ht[index][j] == 0)
searched = searched;
else
{
if (ht[index][j] == x)
{
searched = true;
break;
}
else
{
searched = false;
}
}
}
}
return searched;
}
void remove(int x,int M,int ht[][15])//удаление
{
int t = M / 3;
int index = hashFunction(x);
if (search(x, M, ht))
{
for (int i = 0;i < M / 3;i++)
{
for (int j = 0;j < 15;j++)
{
if (ht[index][j] == x)
{
ht[index][j] = -1;
}
}
}
cout << "Элемент удален по индексу " << index << "\n";
for (int i = 0;i < M/3;i++)
{
cout << i << ") ";
for (int j = 0;j < 15;j++)
cout << ht[i][j] << " ";
cout << endl;
}
}
else
{
cout << "Нельзя удалить элемент, т.к его нет в таблице\n";
}
}
void show(int t,int ht[][15])
{
for (int i = 0;i < t;i++)
{
cout << i << ") ";
for (int j = 0;j < 15;j++)
cout << ht[i][j] << " ";
cout << endl;
}
}
void add(int x, int M, int ht[][15])//добавление
{
int flag = 0;
int index = hashFunction(x);
if (search(x, M, ht))
{
cout << "Такой элемент уже имеется ,его индекс " << index << "\n";
}
else
{
for (int i = 0;i < M / 3;i++)
{
for (int j = 0;j < 15;j++)
{
if (ht[index][j] == 0||ht[index][j]==-1||ht[index][j]!=x)
{
flag++;
}
if (flag == 1)ht[index][j] = x;
}
}
cout << "Элемент добавлен по индексу " << index << "\n";
//show(M / 3, ht);
}
}
void swap(int x,int y,int M,int ht[][15])//замена/занести
{
int index = hashFunction(x);
if (search(x, M, ht))
{
remove(x, M, ht);
cout << "Элемент " << x << " удален из " << index << endl;
if (!search(y, M, ht))
{
add(y, M, ht);
}
}
else
{
cout << "Элемент " << x << " отсутствует\n";
}
show(M / 3, ht);
}
void rnd(int M,int ht[][15])
{
int x = rand() % 90 + 10;
int index = hashFunction(x);
if (!search(x, M, ht))
{
add(x, M, ht);
}
cout << "Добавлено новое число: " << x << " Его индекс " << index << "\n";
show(M / 3, ht);
}
void a(int t,int ht[][15],int M)
{
float k = 0;
for (int i = 0;i < 16;i++)
{
if (ht[i][1] != 0)k++;
}
cout << k / (M / 3);
}
int main()
{
system("chcp 65001");
int M;
cout << "Введите количество элементов\n";
cin >> M;
int* numbers = new int[M];
srand(time(NULL));
Generator(numbers, M);
print(numbers, M);
generateHT(numbers, M);
cout << endl;
cout << endl;
const int t = 52 / 3;
int ht[t][15] = { 0 };
hashing(numbers, 52, ht);
cout << endl;
show(t, ht);
cout << "Коэффициент заполнения таблицы :" << endl;
a(t, ht, M);
cout << endl;
cout << "Среднее число шагов, необходимых для размещения элементов в таблицу:" << endl;
cout << b(t, ht, M);
bool exit = false;
while (!exit) {
int choise;
cout << endl;
cout << "Выберете действие\n"
<< "1.Поиск\n" <<
"2.Удаление\n" <<
"3.Добавить элемент\n"
<< "4.Заменить\n" <<
"5.Вставить рандомное число\n" <<
"6.Коэффициенты\n";
cin >> choise;
switch (choise)
{
case 1:
cout << "\nВведите элемент, который хотите найти";
int newElement;
cin >> newElement;
if (newElement < 10 || newElement>99)
{
cout << "неверный размер ключа\n";
}
else
{
if (search(newElement, M, ht))
{
cout << "элемент найден " << newElement << " его индекс " << hashFunction(newElement) << "\n";
}
else
{
cout << "элемент не найден\n";
}
}
break;
case 2:
cout << "Введите элемент ,который хотите удалить\n";
int removeElement;
cin >> removeElement;
remove(removeElement, M, ht);
break;
case 3:
cout << "Введите элемент , который хотите добавить\n";
int addElement;
cin >> addElement;
add(addElement, M, ht);
show(t, ht);
break;
case 4:
cout << "Выберете элемент ,который хотите заменить\n";
int Changed;
cin >> Changed;
cout << "Введите элемент для замены\n";
int Changing;
cin >> Changing;
swap(Changed, Changing, M, ht);
break;
case 5:
rnd(M, ht);
break;
case 6:
a(t, ht, M);
cout << "\n";
cout << b(t, ht, M);
break;
case 7:
exit = true;
break;
default:
cout << "Ошибка\n";
break;
}
cout << "\n";
system("pause");
}
}
Соседние файлы в предмете Алгоритмы и структуры данных