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

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

在使用Maven编译项目时报错&#xff1a; 不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。 在项目pom.xml文件中增加maven编译的jdk版本设置&#xff0c;maven.compiler.source和maven.compiler.target&#xff1a; <properties&…

random(随机函数生成)

random(随机函数生成&#xff09; #ifndef C11LEARN_RANDOM_H #define C11LEARN_RANDOM_H #include <time.h> #include <stdlib.h> int random_include_left_right(int left,int right); int random_only_include_left(int left,int right); int random_only_incl…

ABP框架 v3.0 已发布!

我们很高兴地宣布,ABP框架和ABP商业版3.0版已经发布.与常规的2周发布一个版本不同的是, 这个版本用了4周的时间.关闭了119个issue,合并了89个pull request 和主框架仓库中的798次提交.由于这是一个主要版本,它也包括了一些重大更改.不要害怕,这些变化都容易对应,并且下面会详细…

C++实现dijkstra单源最短路径

代码如下: #include <iostream> using namespace std; const int N 30; typedef char ElemType; const double noEdge 99999;class Graph { private:double G[N][N];int vertexN, edgeN;double dist[N];bool vis[N];int path[N];int sv;ElemType data[N];int findMinD…

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

hash table(完全散列实现的哈希表) 完全散列 特点&#xff1a;静态的&#xff0c;创建时候完成了散列表的生成。 不可以删&#xff0c;也不可以增加数据。只可以修改数据。 内部用全域散列生成 #ifndef C11LEARN_HASHPERFECT_H #define C11LEARN_HASHPERFECT_H #include &quo…

WPF 框架全构建环境虚拟机硬盘分享

现在 WPF 完全开源了&#xff0c;咱可以构建自己私有的版本。我分享一个虚拟机硬盘给你&#xff0c;只要你下载下来&#xff0c;通过 VMWare 导入&#xff0c;即可无需任何配置&#xff0c;拿到一个能构建 WPF 官方源代码的全构建环境。可以用来只做你的定制版的 WPF 框架现在 …

C++从vector中删除指定元素

①只删除一个元素 vector<int> num;for(vector<int>::iterator iternum.begin();iter!num.end();iter){ //从vector中删除指定的某一个元素 if(*iterk){num.erase(iter);break;} }②删除指定的多个重复元素 erase函数的返回的是指向被删除元素的下一个元素…

二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)

二叉树的遍历(算法导论第三版12.1-4) 1⃣️先序遍历 template<typename T> void preorder_tree_wald(BinaryTreeNode<T> *node) {if(node! nullptr){std::cout<<node->key<<" ";preorder_tree_wald(node->left);preorder_tree_wald(…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

前言回顾上一篇文章《使用Swagger做Api文档 》&#xff0c;文中介绍了在.net core 3.1中&#xff0c;利用Swagger轻量级框架&#xff0c;如何引入程序包&#xff0c;配置服务&#xff0c;注册中间件&#xff0c;一步一步的实现&#xff0c;最终实现生产自动生产API接口说明文档…

C++ vector容器中常见的三种遍历方式

1.迭代器 for (std::vector<int>::iterator it vecTest.begin(); it ! vecTest.end(); it){tempNum *it;}2.C11 新增关键字auto for (auto it : vecTest){tempNum it;}3.对C念念不舍的童鞋们习惯的数组写法 for (size_t i 0; i < maxCount; i){tempNum vecTest[i…

二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

二叉树的中序遍历非递归方法&#xff08;算法导论第三版12.1-3&#xff09; 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion_by_stack(BinaryTreeNode<T> *node) {Stack<BinaryTreeNode<T>*> stack;stack.push(node);whi…

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

第一种写法&#xff1a; #include <iostream> #include <vector> using namespace std;int main() {vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::ite…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)

前言为什么在开发中&#xff0c;接口文档越来越成为前后端开发人员沟通的枢纽呢&#xff1f;随着业务的发张&#xff0c;项目越来越多&#xff0c;而对于支撑整个项目架构体系而言&#xff0c;我们对系统业务的水平拆分&#xff0c;垂直分层&#xff0c;让业务系统更加清晰&…

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本&#xff08;算法导论第三版12.2-2&#xff09; template<typename T> BinaryTreeNode<T>* tree_minimum_recursion(BinaryTreeNode<T>* node) {if(node nullptr) return node;if(node->left ! nullptr)retur…

数据结构-树:根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

使用kibana可视化报表实时监控你的应用程序

先结果导向&#xff0c;来看我在kibana dashborad中制作的几张监控图。一&#xff1a;先睹为快1. dashboard1监控几个维度的日志&#xff0c;这么点日志量是因为把无用的清理掉了&#xff0c;而且只接入了部分应用。每日日志总数。每日日志错误数&#xff0c;从log4net中levelE…

写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)

写出TREE-PREDECESSOR的伪代码&#xff08;算法导论第三版12.2-3&#xff09; TREE-PREDECESSOR(x)if x.left ! NILreturn TREE-MAXIMUM(x.left)y x.pwhile y ! NIL and x y.leftx yy y.preturn y下面是c代码 template<typename T> BinaryTreeNode<T>* tree_…

[EDA]Quartus II 实验简答题

1&#xff0e;使用 Quartus 编辑波形文件时&#xff0c;界面如下图所示&#xff0c;图中用方框标注的区域&#xff0c;名称是什么&#xff1f;在图中&#xff0c;A、B是输入端口&#xff0c;S是输出端口&#xff0c;要编辑的是哪些信号&#xff1f;为什么。 1&#xff0e;方框标…

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

前言在上一篇导出文档番外篇中&#xff0c;我们已经熟悉了怎样根据json数据导出word的文档&#xff0c;生成接口文档&#xff0c;而在这一篇&#xff0c;将对上一篇进行完善补充&#xff0c;增加多种导出方式&#xff0c;实现更加完善的导出功能。回顾1. 获取Swagger接口文档的…

[EDA]FPGA/CPLD 设计流程步骤及步骤概念

EDA&#xff08;以 FPGA/CPLD 设计为例&#xff09;流程步骤 1.设计输入 2.全程编译 3.仿真验证 4.编程下载 5.硬件测试 设计输入 原理图/HDL文本编辑或其他输入方式把电路系统输入到EDA平台中。 综合编译 EDA综合器把设计输入描述的电路系统从高层级转换为低层级的电路网表&am…