Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "locale.h"
- #include <iostream>
- #include <cmath>
- using namespace std;
- // мультиплипликативный метод хеширования(метод умножения)
- int HashFunction(float k) {
- float n = 20001.0; double A = 0.618033; // А взято на осново золотого сечения
- int h = n * fmod((k * A), 1); // n кол-во всевозможных входов
- return fabs(h);
- }
- /*Квадратичным пробированием называется метод разрешения коллизий
- в хеш-таблице с открытой адресацией, при котором i-ый
- элемент последовательности проб это hash(k)+(i^2 * x) mod n
- где n - размер таблицы, x - некоторая фиксированная константа.*/
- int kollisia(float k, int i) {
- int n = 20001, x = 3;
- int res = HashFunction(k) + fmod(i * i * x, n);
- return res;
- }
- void main() {
- setlocale(LC_ALL, "Rus");
- float hash_table[20001]; // таблица
- for (int i = 0; i < 20001; i++) { // заполняем невозможным значение
- hash_table[i] = 10001;
- }
- float key;
- int count = 0, res; // кол-во ввода
- while (true) {
- cout << "Ключ = "; cin >> key;
- count++;
- res = HashFunction(key);
- if (hash_table[res] != 10001) // если ключ занят, то делаем коллизию
- res = kollisia(key, count);
- hash_table[res] = key;
- cout << "HashFunction(" << key << ") = " << res << endl;
- }
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement