Advertisement
Joporezka1

Untitled

Jun 5th, 2022
878
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <ctime>
  4. #include <chrono>
  5.  
  6. #define HASH_SIZE 10000
  7.  
  8. using namespace std;
  9.  
  10. struct node { //структура записи
  11.         int index;
  12.         string name;
  13.         node* next;
  14.     };
  15.  
  16. class HashTable {
  17. public:
  18.     node* table;
  19.     int size=HASH_SIZE;
  20.  
  21.  
  22.     HashTable() {
  23.         table = new node[size]; //выделяем память под массив списков
  24.     }
  25.  
  26.     int hash_function(int key) {
  27.         return key % HASH_SIZE;  //идеальная хеш функция, если городов меньше HASH_SIZE и каждый имеет уникальный ID, иначе коллизии
  28.     }
  29.  
  30.     void add(int key, string name) {
  31.  
  32.  
  33.         int index = hash_function(key);
  34.         node *new_node = new node;
  35.         new_node->index = key;
  36.         new_node->name = name;
  37.         new_node->next = table[index].next;
  38.         table[index].next = new_node;
  39.  
  40.     }
  41.  
  42.     node get(int key,string name) {
  43.         int index = hash_function(key);
  44.         node* temp = table[index].next; //получаем элемент хеш таблицы за постоянное время, далее проверяем все колизии (стоит учесть что это пустой элемент, а не коллизия)
  45.         while(temp != NULL) {
  46.             if(temp->name == name) { //если коллизий нет, то цикл пройдет 1 итерацию, если есть, то идем пока не найдем нужное имя
  47.                 return *temp;
  48.             }
  49.             temp = temp->next;
  50.         }
  51.         node nn = {-1, "NOT FOUND", NULL}; //если не нашли ниче, вернем ошибку
  52.         return nn;
  53.     }
  54.  
  55.     void print_collision(int key){
  56.         int index = hash_function(key);
  57.         node* temp = table[index].next;
  58.         while(temp != NULL) {
  59.             cout << temp->name << endl;
  60.             temp = temp->next;
  61.         }
  62.     }
  63.  
  64.     void print_ht() {
  65.         for(int i = 0; i < size; i++) {
  66.             print_collision(i);
  67.         }
  68.     }
  69.  
  70.     ~HashTable() {
  71.         delete[] table;
  72.     }
  73. };
  74.  
  75. void print_node(node n) {
  76.     cout << n.index << " " << n.name << endl; //просто вывод структуры на экран
  77. }
  78.  
  79.  
  80.  
  81. int main()
  82. {
  83.     srand(time(NULL));
  84.     setlocale(LC_ALL, "Russian");
  85.     system("chcp 1251 > null");
  86.     HashTable ht;
  87.     ht.add(1, "John"); //забиваем
  88.     ht.add(1, "Jane");
  89.     ht.add(1, "Jack");
  90.     ht.add(4, "Jill");
  91.     print_node(ht.get(1, "John"));//ищем
  92.  
  93.     cout<< "Выберите способ: \n1-Ручной ввод \n2-Автоматический \n";
  94.     int n;
  95.     cin >> n;
  96.     if(n==1){
  97.         cout<<"Введите количество городов: ";
  98.         int k;
  99.         cin >> k;
  100.         for(int i=0;i<k;i++){
  101.             cout<<"Введите номер города: ";
  102.             int key;
  103.             cin >> key;
  104.             cout<<"Введите название города: ";
  105.             string name;
  106.             cin >> name;
  107.             ht.add(key, name);
  108.         }
  109.     }else{
  110.         int k;
  111.         cout<<"Введите количество городов: ";
  112.         cin >> k;
  113.         for(int i=0;i<k;i++){
  114.             int key = rand() % k;
  115.             string name;
  116.             name = "City" +to_string(key);
  117.             ht.add(key, name);
  118.         }
  119.         int srch = rand() % k;
  120.  
  121.         cout<<"Ищем город с номером "<<srch<<endl;
  122.         auto start = chrono::steady_clock::now();
  123.         node nd = ht.get(srch, "City" +to_string(srch));
  124.         auto end = chrono::steady_clock::now();
  125.         auto diff = end - start;
  126.         print_node(nd);
  127.         cout<<"Время поиска: "<<chrono::duration <double, nano> (diff).count()<<" нс"<<endl;
  128.  
  129.     }
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement