Advertisement
Guest User

hashTab

a guest
Dec 17th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. //класс списка
  2. template <typename T>
  3. class list
  4. {
  5.     struct Node {
  6.         std::string key;
  7.         T value;
  8.         Node *next;
  9.     };
  10.     Node *head, *tail;
  11.     size_t len;
  12. public:
  13.     list()
  14.     {
  15.         head = tail = nullptr;
  16.         len = 0;
  17.     }
  18.     ~list()
  19.     {
  20.         Node* e(head);
  21.         while (e) {
  22.             Node* buf(e->next);
  23.             delete e;
  24.             e = buf;
  25.         }
  26.     }
  27.     //добавит в список узел
  28.     void push(const std::string& k, T val)
  29.     {
  30.         len++;
  31.         Node* e(new Node);
  32.         e->key = k; e->value = val;
  33.         e->next = nullptr;
  34.         if (head) {
  35.             tail->next = e;
  36.             tail = e;
  37.         }
  38.         else head = tail = e;
  39.     }
  40.     //вернет значение по ключу
  41.     T& take(const std::string& k)
  42.     {
  43.         Node* e(head);
  44.         while (e->key != k) {
  45.             e = e->next;
  46.         }
  47.         return e->value;
  48.     }
  49.     void print()
  50.     {
  51.         Node* e(head);
  52.         if (!e) std::cout << " { empty } " << std::endl;
  53.         else {
  54.             std::cout << " { ";
  55.             while (e) {
  56.                 std::cout << " Key: " << e->key << " Value: " << e->value << " ";
  57.                 e = e->next;
  58.             }      
  59.             std::cout << "}";
  60.         }
  61.     }
  62.     size_t size()
  63.     {
  64.         return len;
  65.     }
  66. };
  67. //класс словаря основанного хэш-таблице
  68. template <typename T>
  69. class htD
  70. {
  71.     size_t hMul; //кол-во символов
  72.     size_t tSize; //размер таблицы
  73.     list<T>* table;//таблица
  74. public:
  75.     htD(size_t s)
  76.     {
  77.         hMul = 31;
  78.         tSize = s;
  79.         table = new list<T>[tSize];
  80.     }
  81.     ~htD()
  82.     {
  83.         delete[] table;
  84.     }
  85.     //хэш-функция
  86.     int hashKP(const std::string& k)
  87.     {
  88.         size_t h (0);
  89.         for (size_t i(0); i < k.length(); i++)
  90.             h = h * hMul + (size_t)k[i];
  91.         return h % tSize;
  92.     }
  93.     //хэш-функция дженскинса
  94.     uint32_t hashJ(const std::string& k)
  95.     {
  96.         uint32_t hash = 0;
  97.         for (size_t i (0); i < k.length(); i++) {
  98.             hash += k[i];
  99.             hash += (hash << 10);
  100.             hash ^= (hash >> 6);
  101.         }
  102.         hash += (hash << 3);
  103.         hash ^= (hash >> 11);
  104.         hash += (hash << 15);
  105.         return hash % tSize;
  106.     }
  107.     //добавит значение в таблицу спомощью хэ-функции дженкинса
  108.     void pushJ(const std::string& k, T val)
  109.     {
  110.         table[hashJ(k)].push(k, val);
  111.     }
  112.     //добавит значение
  113.     void pushKP(const std::string& k, T val)
  114.     {
  115.         table[hashKP(k)].push(k, val);
  116.     }
  117.     //количество коллизий
  118.     size_t collisionNum()
  119.     {
  120.         size_t count(0);
  121.         for (size_t i(0); i < tSize; i++) {
  122.             size_t s = table[i].size();
  123.             count += (s > 1 ? s : 0);
  124.         }
  125.            
  126.         return count;
  127.     }
  128.     //вернет значение по ключу
  129.     T& takeKP(const std::string& k)
  130.     {
  131.         return table[hashKP(k)].take(k);
  132.     }
  133.     //вернет значение по ключу с помощью функции дженкинса
  134.     T& takeJ(const std::string& k)
  135.     {
  136.         return table[hashJ(k)].take(k);
  137.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement