Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

main

.cpp
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
8.29 Кб
Скачать
#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");

    }
}
Соседние файлы в предмете Алгоритмы и структуры данных