【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
来源:互联网 发布:2345好压mac版 编辑:程序博客网 时间:2024/05/16 18:14
二次探测是避免哈希冲突的一种常见手段,思想是:
插入:
找到哈希位置(serch)->如果不冲突就插入,冲突就进行第一次探测
第1次探测:
哈希位置变为原有哈希位置加上1*1的偏移->进行插入
....
....
第i次探测:
哈希位置变为原有哈希位置加上i*i的偏移->进行插入
知道插入完成为止。
如图所示:
哈希类代码如下:
#pragma once#include<vector>#include<string>enum Status{DELETE,EMPTY,EXIST,};template<class K, class V>struct KV{KV(){}KV(K _key, V _value):key(_key), value(_value){}Status s;K key;V value;};template<class K>struct DefaultHash{size_t operator()(const K& k){return k;}};template<>struct DefaultHash<string>{size_t operator()(const string&k){size_t ret = 0;for (size_t i = 0; i < k.size(); ++i){ret *= 10;ret += k[i];}return ret;}};template<class K,class V,class Hash = DefaultHash<K> >class HashTable{public:HashTable(size_t capacity):tables(new KV<K,V>[capacity]),_size(0), _capacity(capacity){for (size_t i = 0; i < _capacity; ++i){tables[i].s = EMPTY;}}HashTable():_size(0), _capacity(0){}void Push(const KV<K,V> &x){size_t index = search(x.key);tables[index].s = EXIST;tables[index].key = x.key;tables[index].value = x.value;++_size;}void Print(){for (size_t i = 0; i < _capacity; ++i){cout << i << ":";if (tables[i].s == EXIST)cout <<"["<<tables[i].key<<","<< tables[i].value<<"]";elsecout << "NULL";cout << endl;}cout << endl;}int Find(const K& key){Hash Search;int index = Search(key) % _capacity;size_t i = 0;while (tables[index].s != EMPTY){if (tables[index].key == key&&tables[index].s == EXIST)return index;i++;index += 2*i-1;if (index >= _capacity)index %= _capacity;}return -1;}void Pop(const K& key){int index = Find(key);if (index > 0){tables[index].s = DELETE;_size--;}}~HashTable(){if (tables)delete[]tables;_size = 0;_capacity = 0;}protected:size_t search(K key){if (_size * 2 >= _capacity){HashTable tmp(_capacity * 2 + 10);for (size_t i = 0; i < _capacity; ++i){if (tables[i].s == EXIST)tmp.Push(tables[i]);}std::swap(tables, tmp.tables);std::swap(_size, tmp._size);std::swap(_capacity, tmp._capacity);}Hash Search;size_t index = Search(key)%_capacity;size_t i = 0;while (tables[index].s == EXIST){i++;index += i*i;if (index >= _capacity)index %= _capacity;}return index;}protected:KV<K,V>* tables;size_t _size;size_t _capacity;};
如有疑问希望提出,有不足也希望指正
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1772192
0 0
- 【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
- 简单的key-value实现
- 哈希冲突的处理【闭散列方法-线性探测和二次探测】
- hash,分离链接法,探测散列表(二次探测),再散列的代码
- 哈希表KV形式的二次探测
- redis在spring集成下key与value的使用方法
- 二次排序的实现代码
- iOS设计模式之KVO Key-Value Observing 键值观察者模式的简单实用和介绍
- key-value数据库的一种实现
- key-value数据库的一种实现
- Map的key,value与null简例
- js取object的key与value
- System.getProperties的key与value.
- Key 与 Value 并发的Cache 设计
- key形式哈希表的线性探测
- java获取redis中各种数据类型key对应的value代码简单封装
- 一个简单的Key-Value小数据库tmdb的原理和实现
- [整理]关于map的简单操作和按照Key与value的排序
- 【代码】C++实现广义表及其测试用例
- 【代码】C++实现二叉树基本操作及测试用例
- 二叉树的线索化算法思想详解
- 【代码】c++堆的简单实现
- 堆排序算法思路详解
- 【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
- 【代码】稀疏矩阵的压缩存储与转置算法
- LINUX下的几个常见的环境变量
- 【干货】C++哈希桶(开链法解决哈希冲突)类的实现
- 【干货】位图的实现与布隆过滤器
- Linux下find函数用法汇总
- 【随笔】Linux文件的三个时间属性
- 51 nod 1067 Bash游戏V2
- 【博文搬家通知】