hash table(全域散列法实现的哈希表)

利用每次重建哈希表时随机生成散列函数


#ifndef C11LEARN_HASHUNIVERSAL_H
#define C11LEARN_HASHUNIVERSAL_H
#include "Chain.h"
#include "../tools/random.h"
template<typename T>
class HashUniversal
{protected:Chain<T>** array;int capacity;long long large_prime_numbers;long long a;long long b;
public:HashUniversal(int capacity = 1<<10,long long large_prime_numbers = 100001651);HashUniversal(const HashUniversal<T>& hashUniversal);const HashUniversal<T>& operator=(const HashUniversal<T>& hashUniversal);~HashUniversal();T & operator[](int key);bool remove(int key);protected:virtual int hashing(int key);void insert(Chain<T>* node);Chain<T>*search(int key);void clear();void copy(const HashUniversal<T> & hashUniversal);bool remove(Chain<T>* node);
};
template<typename T>
HashUniversal<T>::HashUniversal(int capacity,long long large_prime_numbers):capacity(capacity),large_prime_numbers(large_prime_numbers){array = new Chain<T>*[this->capacity];a = random_include_left_right(1ll,this->large_prime_numbers-1);b = random_include_left_right(0ll,this->large_prime_numbers-1);
}
template<typename T>
HashUniversal<T>::HashUniversal(const HashUniversal<T>& hashUniversal)
{capacity = hashUniversal.capacity;a = hashUniversal.a;b = hashUniversal.b;array = new Chain<T>*[this->capacity];large_prime_numbers = hashUniversal.large_prime_numbers;copy(hashUniversal);
}
template<typename T>
const HashUniversal<T>& HashUniversal<T>::operator=(const HashUniversal<T>& hashUniversal){if(this == &hashUniversal) return *this;clear();delete[] array;capacity = hashUniversal.capacity;a = hashUniversal.a;b = hashUniversal.b;array = new Chain<T>*[this->capacity];large_prime_numbers = hashUniversal.large_prime_numbers;copy(hashUniversal);return *this;
}
template<typename T>
HashUniversal<T>::~HashUniversal(){clear();if(array!= nullptr){delete [] array;array = nullptr;}
}
template<typename T>
T & HashUniversal<T>::operator[](int key){Chain<T>* node = search(key);if(node == nullptr){node = new Chain<T>();node->key = key;insert(node);}return node->value;
}
template<typename T>
int HashUniversal<T>::hashing(int key)
{return ((a*key+b)%large_prime_numbers)%capacity;
}
template<typename T>
void HashUniversal<T>::insert(Chain<T>* node){int pos = hashing(node->key);Chain<T>* current = array[pos];if(current == nullptr){array[pos] = node;}else{current->prev = node;node->next = current;}
}
template<typename T>
Chain<T>* HashUniversal<T>::search(int key){int pos = hashing(key);Chain<T>* current = array[pos];while (current!= nullptr && current->key != key)current = current->next;return current;
}
template<typename T>
void HashUniversal<T>::clear(){Chain<T>* current;Chain<T>* next;for (int i = 0; i < capacity; ++i) {current = array[i];while (current!= nullptr){next = current->next;delete current;current = next;}}
}
template<typename T>
void HashUniversal<T>::copy(const HashUniversal<T> & hashUniversal){Chain<T>* current;Chain<T>* prev;for (int i = 0; i < capacity; ++i) {prev = nullptr;current = hashUniversal.array[i];while (current!= nullptr){prev = current;current = current->next;}while (prev!= nullptr){Chain<T>* node = new Chain<T>();node->key = prev->key;node->value = prev->value;insert(node);prev = prev->prev;}}
}
template<typename T>
bool HashUniversal<T>::remove(int key){Chain<T>* node = search(key);if(node == nullptr){return false;}return remove(node);
}
template<typename T>
bool HashUniversal<T>::remove(Chain<T>* node){if(node == nullptr) return false;if(node->prev == nullptr){int pos = hashing(node->key);array[pos] = node->next;if(node->next!= nullptr){node->prev = nullptr;}}else{node->prev->next = node->next;if(node->next!= nullptr){node->next->prev = node->prev;}}delete node;node = nullptr;return true;
}
#endif //C11LEARN_HASHUNIVERSAL_H

辅助类
1⃣️Chain链接地址
2⃣️random_include_left_right链接地址

测试代码

 HashUniversal<string> hashUniversal;hashUniversal[2] = "hello";hashUniversal[123456] = "world";cout << hashUniversal[2] << endl;cout << hashUniversal[123456] << endl;HashUniversal<string> hashUniversal1 = hashUniversal;cout << hashUniversal1[2] << endl;cout << hashUniversal1[123456] << endl;HashUniversal<string> hashUniversal2;hashUniversal2 = hashUniversal;cout << hashUniversal2[2] << endl;cout << hashUniversal2[123456] << endl;cout<<hashUniversal2.remove(123456)<<endl;

hash table(全域散列法实现的哈希表)相关推荐

  1. hash table(完全散列实现的哈希表)

    hash table(完全散列实现的哈希表) 完全散列 特点:静态的,创建时候完成了散列表的生成. 不可以删,也不可以增加数据.只可以修改数据. 内部用全域散列生成 #ifndef C11LEARN_ ...

  2. ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

    哈希表概念 哈希表(散列表),是基于关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数(哈希函数 ...

  3. hash table(用乘法散列法实现)

    hash table(用乘法散列法实现) #ifndef C11LEARN_HASHMULTI_H #define C11LEARN_HASHMULTI_H #include "HashDi ...

  4. 哈希表(Hash Table)及散列法(Hashing)

    bigshuai 哈希 源地址 http://www.cnblogs.com/bigshuai/articles/2398116.html 哈希表(Hash Table)及散列法(Hashing) 数 ...

  5. c#加密:二、散列法 MD5、SHA256、SHA512

    散列法提供了一种单向加密的方式.这种方式非常适用于在数据库中存储密码.因为我们无须(也不希望)提供解密的信息.在登录验证时,只需简单地将用户的输入进行散列,并和数据库中存储的散列值进行比较即可. 由于 ...

  6. 数据结构记录--散列法实验

    Home Web Board ProblemSet Standing Status Statistics Problem A: 散列法的实验 Time Limit: 1 Sec  Memory Lim ...

  7. 散列(2)线性探测法和双重散列法

    接上篇 散列的简要描述和链地址法 解决散列冲突的方法: 1. 线性探测法 如果我们能够预测将要存入表中元素的数目,而且我们有足够的内存空间可以容纳带有空闲空间的所有关键字,那么使用链地址法是不值得的. ...

  8. 哈希(散列):(四)C语言实现 哈希 开散列法

    哈希(散列)的概念: https://blog.csdn.net/mowen_mowen/article/details/82943192 C语言实现:静态哈希表: https://blog.csdn ...

  9. 区块链基础:散列法 (Hashing)

    灯泡,比特(bits)与字节(bytes) 你可能知道计算机中所有的数据都是由0或1组成的,最小的数据单位就是一个比特(bit,或位),它也是0或者1.想象一下,一台计算机拥有着很多的灯泡,而这个灯泡 ...

最新文章

  1. NtQueryInformationProcess用法
  2. linux命令:vmstat
  3. 优化算法求解复杂约束问题策略(以粒子群算法为例讲解求解复杂约束问题的多种策略)
  4. 服务器通电显示黄灯,服务器内存亮黄灯
  5. Bluetooth Obex
  6. java判断路径是否存在_科学网—Java判断文件目录以及文件是否存在 - 林清莹的博文...
  7. 中原工学院计算机网络,计算机网络 考试重点 中原工学院.doc
  8. java输入任意一个字母的语句_java-检查用户输入的字符串是否包含用户输入的字母(不包括任何多余字母)的if语句...
  9. iphone6出信号 无服务器,iPhone6手机无服务(非常见故障点)维修
  10. 牛逼!SpringBoot+Vue企业级支付系统!附源码!
  11. Laravel 使用 seeder 使用要点
  12. 时间计算题100道_数学大作战!小学13000道计算题+20000道口算题立即领!
  13. oracle学习笔记(四)-- 数学函数
  14. 滴滴巨亏背后,打江山容易,守江山难?
  15. 产业新闻-2006.06.02-05
  16. 作为PM,要知道的四类产品文档
  17. 踔厉奋发·勇毅前行 | 2023广和通中国区代理商大会成功召开
  18. 零基础要怎么样学习嵌入式Linux
  19. openmeetings 2.0 汉化文件
  20. 另人怀念的小游戏:惊险摩托

热门文章

  1. 地理素养的核心构成和主要特点
  2. 剑指offer之快速排序
  3. linux之可视化查看磁盘大小并且删除大文件
  4. 求字符串的不重复字符的最长子串长度的问题
  5. Android之 如何解决ScrollView 和ListView滑动冲突的问题如何解决ScrollView can host only one direct child
  6. mysql之主从复制 简书_MySQL主从复制(传统)
  7. 三角形中的“叛徒”--莱洛三角形,一个神奇的存在!
  8. 做题不如巧做题,初中数学题型解题技巧都在这!
  9. 机器学习的最佳学习路线,就在这里!
  10. php 查询数据是否大于,怎么实现从数据查询数据的时候判断如果数据大于N条分次查询 递归吗?...