hash table(开放寻址法-线性探查实现的哈希表)

//
// Created by 许加权 on 2021/7/17.
//#ifndef C11LEARN_HASHLINER_H
#define C11LEARN_HASHLINER_H
#include "KeyNode.h"
template<typename T>
class HashLiner
{public:HashLiner();HashLiner(const HashLiner<T> & hashLiner);~HashLiner();const HashLiner<T>& operator=(const HashLiner<T> & hashLiner);T & operator[](int key);
protected:long long capacity;KeyNode<T>** array;long long w;long long p;long long s;long long two_32;
protected:virtual int auxiliary_hashing(int key);virtual int hashing(int key,int index);void insert(KeyNode<T>* node);KeyNode<T>*search(int key);void clear();void copy(const HashLiner<T> & hashLiner);
};template<typename T>
HashLiner<T>::HashLiner(){s = 2654435769;w = 32;p = 14;two_32 = 1;two_32 = two_32<<32;capacity = 1<<p;array = new KeyNode<T>*[capacity];
}
template<typename T>
HashLiner<T>::HashLiner(const HashLiner<T> & hashLiner){s = 2654435769;w = 32;p = 14;two_32 = 1;two_32 = two_32<<32;capacity = 1<<p;array = new KeyNode<T>*[capacity];copy(hashLiner);
}
template<typename T>
HashLiner<T>::~HashLiner(){clear();if(array!= nullptr){delete [] array;array = nullptr;}
}
template<typename T>
void HashLiner<T>::copy(const HashLiner<T> & hashLiner){for (int i = 0; i < capacity; ++i) {if(hashLiner.array[i]!= nullptr){array[i] = new KeyNode<T>(hashLiner.array[i]->key,hashLiner.array[i]->value);}}
}
template<typename T>
const HashLiner<T>& HashLiner<T>::operator=(const HashLiner<T> & hashLiner){if(this == &hashLiner) return *this;clear();copy(hashLiner);return *this;
}
template<typename T>
T & HashLiner<T>::operator[](int key){KeyNode<T>* node = search(key);if(node == nullptr){node = new KeyNode<T>();node->key = key;insert(node);}return node->value;
}
template<typename T>
int HashLiner<T>::auxiliary_hashing(int key){return ((key*s)%two_32)>>(w-p);
}
template<typename T>
int HashLiner<T>::hashing(int key,int index){return (auxiliary_hashing(key)+index) % capacity;
}
template<typename T>
void HashLiner<T>::insert(KeyNode<T>* node){int i = -1;int j;while (++i<capacity){j = hashing(node->key,i);if(array[j] == nullptr) {array[j] = node;return;}}throw "hash table overflow";
}
template<typename T>
KeyNode<T>* HashLiner<T>::search(int key){int i = -1;int j;while (++i<capacity){j = hashing(key,i);if(array[j] == nullptr)return nullptr;if(array[j]->key == key)return array[j];}return nullptr;
}
template<typename T>
void HashLiner<T>::clear(){for (int i = 0; i < capacity; ++i) {if(array[i]!= nullptr){delete array[i];array[i] = nullptr;}}
}
#endif //C11LEARN_HASHLINER_H

测试代码

    HashLiner<string> hashLiner;hashLiner[2] = "hello";hashLiner[123456] = "world";cout << hashLiner[2] << endl;cout << hashLiner[123456] << endl;HashLiner<string> hashLiner1 = hashLiner;cout << hashLiner1[2] << endl;cout << hashLiner1[123456] << endl;HashLiner<string> hashLiner2;hashLiner2 = hashLiner;cout << hashLiner2[2] << endl;cout << hashLiner2[123456] << endl;

辅助类
KeyNode地址
辅助auxiliary_hashing函数是利用乘法散列法实现的

hash table(开放寻址法-线性探查实现的哈希表)相关推荐

  1. hash table(开放寻址法-双重散列实现的哈希表)

    hash table(开放寻址法-双重散列实现的哈希表) #ifndef C11LEARN_HASHDOUBLE_H #define C11LEARN_HASHDOUBLE_H #include &q ...

  2. hash table(开放寻址法-二次探查实现的哈希表)

    hash table(开放寻址法-二次探查实现的哈希表) #ifndef C11LEARN_HASHQUADRATIC_H #define C11LEARN_HASHQUADRATIC_H #incl ...

  3. Hash表_拉链法_开放寻址法_模拟散列表

    文章目录 Hash表 作用 ① 拉链法 ② 开放寻址法 例 - 模拟散列表 > 拉链法 > 开放寻址法 Hash表 一般只有添加.查找 (注意:离散化为特殊的哈希方式,因为离散化需要提前保 ...

  4. 用开放地址法中的线性探查法解决冲突实现哈希表的运算

    为了更深的理解哈希算法,自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算. /*** Created by lirui on 14-8-13.* 用开放地址法中的线性探查法解决冲突实现哈希表 ...

  5. PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数

    文章目录 题目分析 题目链接 题目分析 来源:acwing 本题的分析见另一道PAT的题目:PAT甲级1078 Hashing:[C++题解]哈希表.哈希表开放寻址法.二次探测法链接的题目就是让建立h ...

  6. PAT甲级1078 Hashing:[C++题解]哈希表、哈希表开放寻址法、二次探测法

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 本题建立hash表是利用只具有正增量的二次探测法来解决冲突, 索引 = 数 % 哈希表的大小 如果映射到同一个索引idx,hash表 ...

  7. 开放寻址法VS链表法

    开放寻址法 只用数组一种数据结构存储,继承了数组的优点,对CPU缓冲友好,易于序列化.但是对内存的利⽤率并不如链表法,且冲突的代价更高.当数据量⽐较⼩.装载因⼦⼩的时候,适合采⽤开放寻址法.这也是Ja ...

  8. 00002-两数之和-leetcode-1.暴力法(枚举法),2.哈希表法,目前更新了枚举法

    两数之和 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. ...

  9. Java:实现具有开放寻址冲突解析方法(如linear)的哈希表基类算法(附完整源码)

    Java:实现具有开放寻址冲突解析方法的哈希表基类算法 package com.williamfiset.algorithms.datastructures.hashtable;import java ...

最新文章

  1. JLOI2011 飞行路线
  2. 【项目管理】进度管理
  3. Codeforces - 914F bitset 维护字符串匹配个数
  4. python运算学习之Numpy ------ 数组的切片索引与循环遍历、条件和布尔数组、形状变化...
  5. P6047-丝之割【斜率优化,dp】
  6. Java临时缓存API –测试早期草案评审RI
  7. Bootstrap 输入框组中控件的尺寸
  8. 关于静态成员变量的谈论
  9. mysql分页查询所有数据库,数据库分页查询
  10. 计算工资底薪加提成的java_月工资如何计算我是做服务行业,底薪2200全勤100加提成5 - 找法网(findlaw.cn)...
  11. 优麒麟十年,聚生态之力压缩时间壁垒
  12. win 10安装MySQL
  13. java 有三个map,第一个map是第二个和第三个map的key的对应映射,对比第二个map的值和第三个map对的值是否一致
  14. 群体智能之人工蜂群算法及其改进(ABC)
  15. CAM350 简单使用
  16. 产品经理学习——Axure常用快捷键
  17. 《女士品茶》读书笔记
  18. python人机猜拳随机,python实现人机猜拳小游戏
  19. 网页验证码识别实例VB.NET2019(二)
  20. 小米路由器连电信路由器,dhcp服务无响应

热门文章

  1. ArcGIS 10.2数字化线状要素时自动拼接成一条线
  2. 史上最全的Visual Studio Code安装C/C++环境,若不行头砍给你。
  3. Android之封装倒计时页面
  4. 剑指offer之先序非递归打印二叉树
  5. C和指针之二维字符串数组用指针数组、数组指针、二级指针打印
  6. Android之Eclipse下面如何看Android源代码
  7. (12)python 的列表我从没想过会那么好用
  8. (一)python3 只需3小时带你轻松入门—— 编程尝试
  9. html5制作线路图,HTML5绘制上海地铁线路图
  10. 盘点那些世间顶级直男hhhhhh | 今日最佳