Advertisement
Qellex

siaod 4 - 5v

Mar 23rd, 2022
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include "locale.h"
  2. #include <iostream>
  3. #include <cmath>
  4. #include <string>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. // модульный метод хеширования
  10. long long hash_key(string v, int M) {
  11.  
  12.     long long h = 0;
  13.     int a = 127;
  14.     for (int i = size(v); i >= 0; i--)
  15.         h = (a * h + static_cast<int>(v[i])) % M;
  16.     return h;
  17. }
  18.  
  19. // Ячейки хеш-таблицы последовательно просматриваются с некоторым
  20. // фиксированным интервалом k между ячейками (обычно, k = 1),
  21. // то есть i-й элемент последовательности проб — это ячейка с номером (hash(x) + ik) mod N
  22. int kollisia(string v, int M, int i) {
  23.     int k = 1;
  24.     int res = (hash_key(v , M) + i * k) % M;
  25.     return res;
  26. }
  27.  
  28. int main() {
  29.     setlocale(LC_ALL, "Rus");
  30.     int M; // размер хеш таблицы
  31.     cout << "Введите размерность хеш таблицы - ";
  32.     cin >> M;
  33.     string* hash_table = new string[M]; // cоздание хеш таблицы
  34.     bool* hash_table_bool = new bool[M]; // таблица для просмотра заполненых элементов
  35.     for (int i = 0; i < M; i++)
  36.         hash_table_bool[i] = false; // делаем что все пусты
  37.  
  38.     string key; // ключ хеш таблицы
  39.     int count = 0, res; // кол-во ввода, место в таблице
  40.     while (true) {
  41.         if (count == M) { // в случае если таблица заполнена вся
  42.             cout << "Все ключи заняты. \n";
  43.             return 0;
  44.         }
  45.         bool f; // переменная для проверки правильности ввода
  46.         do {
  47.             f = false;
  48.             cout << "Ключ = "; cin >> key;
  49.             for (int i = 0; i < M; i++) { // проверка на то есть ли такой ключ уже
  50.                 if (hash_table[i] == key) {
  51.                     f = true;
  52.                     cout << "Такой ключ уже есть! Введите другой" << endl;
  53.                 }
  54.             }
  55.         } while (f);
  56.         count++; // добавляем кол-во введенных
  57.         res = hash_key(key, M);
  58.         while (hash_table_bool[res]) // если ключ занят, то делаем коллизию
  59.             res = kollisia(key, M, count);
  60.         hash_table[res] = key; // заполняем
  61.         hash_table_bool[res] = true; // говорим что есть в той ячейке значение
  62.         cout << "HashFunction(" << key << ") = " << res << endl;
  63.     }
  64.     system("pause");
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement