Hash表c++实现
来源:互联网 发布:java算法书籍推荐 编辑:程序博客网 时间:2024/06/08 07:26
闭散列
#include<iostream>#include<vector>using namespace std;enum State{ EMPTY = 1, EXITS = 2, DELETE = 3,};const int _PrimeSize = 28;static const unsigned int _PrimeList[_PrimeSize] ={ 53ul, 97ul, 193ul, 389ul, 769ul, 1543ul, 3079ul, 6151ul, 12289ul, 24593ul, 49157ul, 98317ul, 196613ul, 393241ul, 786433ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, 1610612741ul, 3221225473ul, 4294967291ul};template<class K, class V>struct HashNode{ K _key; V _value; State _state; HashNode() :_state(EMPTY) {}};template<class K>struct __HashFunc{ size_t operator()(const K& key) { return key; }};template<>struct __HashFunc<string>{ static size_t BKDRHash(const char * str) { unsigned int seed = 131; // 31 131 1313 13131 131313 unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); } return (hash & 0x7FFFFFFF); } size_t operator()(const string& key) { return BKDRHash(key.c_str()); }};template<class K, class V,class HashFunc=__HashFunc<K>>class HashTable{ typedef HashNode<K,V> Node;public: HashTable() :_size(0), _tables(5) {} bool Insert(const K& key, const V& value,bool flag=true) { CheckCap(); size_t index = _HashFunc(key); size_t start = index; int i = 0; while (_tables[index]._state == EXITS&&_tables[index]._key!=key) { if (flag) { index = start + (1 << i++); } else { index++; } if (index >= _tables.size()) index %= _tables.size(); } if (_tables[index]._key == key) return false; _tables[index]._key = key; _tables[index]._value = value; _tables[index]._state = EXITS; _size++; return true; } Node* Find(const K& key) { size_t index = _HashFunc(key); while (_tables[index]._key != key && (_tables[index]._state == DELETE || _tables[index]._state == EXITS)) { index++; if (index == _tables.size()) index = 0; } if (_tables[index]._key == key&&_tables[index]._state==EXITS) return &_tables[index]; else return nullptr; } bool Remove(const K& key) { size_t index = _HashFunc(key); while (_tables[index]._key != key && (_tables[index]._state == DELETE || _tables[index]._state == EXITS)) { ++index; if (index == _tables.size()) index == 0; } if (_tables[index]._state == EMPTY || _tables[index]._state==DELETE) return false; else { _tables[index]._state = DELETE; return true; } }protected: unsigned int Getprimer(unsigned int x) { for (auto&i : _PrimeList) { if (x < i) return i; } return x; } void CheckCap() { if (_size * 10 / _tables.size()>7) { HashTable<K, V, HashFunc> newtable; newtable._tables.resize(Getprimer(_tables.size())); for (auto & i : _tables) { if (i._state == EXITS) newtable.Insert(i._key,i._value); } newtable._tables.swap(_tables); } } size_t _HashFunc(const K&key) { return HashFunc()(key) % _tables.size(); }private: vector<Node> _tables; size_t _size;};
开散列
template<class K>struct __HashFunc{ size_t operator()(const K& key) { return key; }};template<>struct __HashFunc<string>{ static size_t BKDRHash(const char * str) { unsigned int seed = 131; // 31 131 1313 13131 131313 unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); } return (hash & 0x7FFFFFFF); } size_t operator()(const string& key) { return BKDRHash(key.c_str()); }};template<class ValueType>struct HashNode{ ValueType _valueField; HashNode<ValueType> * _next; HashNode(const ValueType& valueField) :_valueField(valueField) , _next(NULL) {}};template<class ValueFiled>struct KeyofValue{ auto operator()(ValueFiled value) ->decltype(value.first) { return value.first; }};template<class Key,class V, class ValueofKey, class HashFunc>class HashTable{ typedef V ValueType; typedef HashNode<V> Node;public: HashTable() :_tables(Getprimer(0)),_size(Getprimer(0)) {} bool Insert(const ValueType& valueField) { ValueofKey Keyofvalue; int key = Keyofvalue(valueField); int index = _HashFunc(key); Node* pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField)==key) return false; } Node * NewNode = new Node(valueField); NewNode->_next = _tables[index]; _tables[index] = NewNode; ++_size; return true; } Node* Find(const Key& key) { ValueofKey Keyofvalue; int index = _HashFunc(key); Node * pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField) == key) return pCur; } return nullptr; } bool Remove(const Key& key) { ValueofKey Keyofvalue; int index = _HashFunc(key); Node * pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField) == key) { pCur->_valueField = _tables[index]->_valueField; Node * del = _tables[index]; _tables[index] = _tables[index]->_next; delete del; --_size; return true; } } return false; } ~HashTable() { for(auto & i :_tables) { Node * pCur = i; Node * pNext = NULL; while(pCur) { pNext = pCur->_next; delete pCur; pCur = pNext; } } }protected: size_t _HashFunc(const Key&key) { return HashFunc()(key) % _tables.size(); } unsigned int Getprimer(unsigned int x) { for (auto&i : _PrimeList) { if (x < i) return i; } return x; } void CheckCap() { ValueofKey valueofkey; if (_size==_tables.size()) { HashTable<Key, V, HashFunc,HashFunc> newtable(Getprimer(_tables.size())); for (auto&i : _tables) { Node * pCur = i; while (pCur) { newtable.Insert(pCur->_valueField); pCur = pCur->_next; } } newtable._tables.swap(_tables); } }private: vector<Node*> _tables; size_t _size;};
Unordered__Map / Unordered_Set 实现
template<class K>struct __HashFunc{ size_t operator()(const K& key) { return key; }};template<>struct __HashFunc<string>{ static size_t BKDRHash(const char * str) { unsigned int seed = 131; // 31 131 1313 13131 131313 unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); } return (hash & 0x7FFFFFFF); } size_t operator()(const string& key) { return BKDRHash(key.c_str()); }};template<class ValueType>struct HashNode{ ValueType _valueField; HashNode<ValueType> * _next; HashNode(const ValueType& valueField) :_valueField(valueField) , _next(NULL) {}};template<class Key, class V, class ValueofKey, class HashFunc>class HashTable{ typedef V ValueType; typedef HashNode<V> Node;public: friend struct HashTableIterator<Key,V,ValueofKey,HashFunc>; typedef HashTableIterator<Key, V, ValueofKey, HashFunc> Iterator; HashTable() :_tables(Getprimer(0)), _size(Getprimer(0)) {} pair<Iterator, bool> Insert(const ValueType& valueField) { ValueofKey Keyofvalue; int key = Keyofvalue(valueField); int index = _HashFunc(key); Node* pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField) == key) return pair<Iterator, bool>(Iterator(NULL,this), false); } Node * NewNode = new Node(valueField); NewNode->_next = _tables[index]; _tables[index] = NewNode; ++_size; return std::pair<Iterator,bool>(Iterator(NewNode,this),true); } Iterator Find(const Key& key) { ValueofKey Keyofvalue; int index = _HashFunc(key); Node * pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField) == key) return Iterator(pCur,this); } return Iterator(nullptr,this); } bool Remove(const Key& key) { ValueofKey Keyofvalue; int index = _HashFunc(key); Node * pCur = _tables[index]; while (pCur) { if (Keyofvalue(pCur->_valueField) == key) { pCur->_valueField = _tables[index]->_valueField; Node * del = _tables[index]; _tables[index] = _tables[index]->_next; delete del; --_size; return true; } } return false; }protected: size_t _HashFunc(const Key&key) { return HashFunc()(key) % _tables.size(); } unsigned int Getprimer(unsigned int x) { for (auto&i : _PrimeList) { if (x < i) return i; } return x; } void CheckCap() { ValueofKey valueofkey; if (_size == _tables.size()) { HashTable<Key, V, HashFunc, HashFunc> newtable(Getprimer(_tables.size())); for (auto&i : _tables) { Node * pCur = i; while (pCur) { newtable.Insert(pCur->_valueField); pCur = pCur->_next; } } newtable._tables.swap(_tables); } }private: vector<Node*> _tables; size_t _size;};template<class Key, class V, class ValueofKey, class HashFunc>struct HashTableIterator{ typedef HashNode<V> Node; typedef HashTableIterator<Key, V, ValueofKey, HashFunc> Self; typedef HashTable<Key, V, ValueofKey, HashFunc> _HashTable; Node * _node; _HashTable * _hashTables; HashTableIterator(Node * node, _HashTable* hashTable) :_node(node) , _hashTables(hashTable) {} V& operator*() { return _node->_valueField; } V* operator->() { return &(_node->_valueField); } bool operator==(const Self& s) const { return _node == s._node; } bool operator!=(const Self& s) const { return _node != s._node; } Self& operator++() { if (_node->_next != nullptr) { _node = _node->_next; } else { ValueofKey valueofkey; size_t index = valueofkey(_node->_valueField); int size = _hashTables->_tables.size(); _node = NULL; for (int i = index + 1; i < size; ++i) { if (_hashTables->_tables[i]) { _node = _hashTables->_tables[i]; break; } } } return *this; }};template<class V>struct _KeyOfValue{ const V& operator()(const V& value) { return value; }};template<class K,class V>struct _PairKeyOfValue{ const K& operator()(const V& value) { return value.first; }};template<class K ,class HashFunc=__HashFunc<K>>class Unorderd_Set{ typedef HashTableIterator<K, K,_KeyOfValue<K>, HashFunc> Iterator;public: Unorderd_Set() :_Hashtable() {} Iterator Begin() { int size = _Hashtable._tables.size(); for (int i = 0; i < size; ++i) { if (_Hashtable._tables[i]) return Iterator(_Hashtable._tables[i]); } return Iterator(NULL,&_Hashtable); } const Iterator End() { return Iterator(NULL, &_Hashtable); } const std::pair<Iterator, bool> Insert(K valueFiled) { return _Hashtable.Insert(valueFiled); } const Iterator find(const K&key) { return _Hashtable.Find(key); } bool Remove(const K& key) { return _Hashtable.Remove(key); }private: HashTable<K, K, _KeyOfValue<K>, HashFunc> _Hashtable;};template<class K, class V, class HashFunc = __HashFunc<K>>class Unorderd_Map{ typedef std::pair<K,V> ValueFiled; typedef HashTableIterator<K, ValueFiled, _PairKeyOfValue<K,ValueFiled>, HashFunc> Iterator;public: Unorderd_Map() :_Hashtable() {} Iterator Begin() { int size = _Hashtable._tables.size(); for (int i = 0; i < size; ++i) { if (_Hashtable._tables[i]) return Iterator(_Hashtable._tables[i],&_Hashtable); } return Iterator(NULL, &_Hashtable); } Iterator End() { return Iterator(NULL, &_Hashtable); } std::pair<Iterator, bool> Insert(ValueFiled &value) { return _Hashtable.Insert(value); } Iterator find(const K&key) { return _Hashtable.Find(key); } bool Remove(const K& key) { return _Hashtable.Remove(key); }private: HashTable<K, ValueFiled, _PairKeyOfValue<K,ValueFiled>, HashFunc> _Hashtable;};
阅读全文
0 0
- hash表 c语言实现
- Hash桶实现hash表
- C语言中的两种hash表的实现
- 配合Dijkstra算法的Hash表实现文件C语言
- hash表的openADDRESSing的c语言实现
- 用c实现HASH表创建、插入、查找、删除、打印
- 用c实现HASH表创建、插入、查找、删除、打印
- C语言 开放寻址法HASH表存储简单实现
- HASH表的实现(拉链法) - C/C++
- C/C++ Hash表
- Delphi实现Hash表
- Java实现Hash表
- hash表C++实现
- Hash表实现 C++
- 实现数据结构Hash表
- hash表简单实现
- hash表的实现
- C++实现Hash表
- awk内置变量之FNR/NR、FS/OFS、NF、ORS/RS
- 欢迎使用CSDN-markdown编辑器
- 全局变量错误
- MySQL存储过程题目
- js中的键盘事件:onkeydown、onkeypress、onkeyup
- Hash表c++实现
- Android开发页面去掉顶部标题栏
- 2017.11.3 LeetCode
- C语言入门——数字特征值
- hibernate查询list结果集结果都是一样
- s3c2440 ARM9 裸机驱动第一篇-GPIO驱动(C)
- [2017纪中11-3]机房比教室好多了 博弈+树型DP
- JAVA内存模型
- cipher