当前位置:   article > 正文

哈希表----闭散列

哈希表----闭散列

闭散列

当我们用哈希函数的时候,其中一个就是除留余数法

取这个表的长度len,按照哈希函数:Hash(key) = key% len,将这个位置映射到表中

通过上面的除留余数法,会有哈希碰撞的问题,可以通过闭散列来解决

闭散列也叫开放定址法,通过线性探测,依次找后面的位置存储

插入 

 哈希表数据定义

  1. enum State
  2. {
  3. EMPTY,
  4. EXIST,
  5. DELETE
  6. };
  7. template<class K, class V>
  8. struct HashData
  9. {
  10. pair<K, V> _kv;
  11. State _state=EMPTY;
  12. };

 哈希表的底层可以用vector封装 

  1. template<class K,class V>
  2. class HashTable
  3. {
  4. public:
  5. bool insert(const pair<K,V>& kv)
  6. {
  7. ...........
  8. }
  9. private:
  10. vector<HashData<K, V>> _ht;
  11. size_t _n = 0;//记录表中数据个数
  12. };

插入问题1

当用除留余数法的时,除以的的vector的capacity还是size呢?

  1. bool insert(const pair<K,V>& kv)
  2. {
  3. int hashi = kv.first% _ht.size();
  4. int index = hashi;
  5. int i = 1;
  6. while (_ht[index]._state ==EXIST)
  7. {
  8. index = hashi + i;
  9. index %= _ht.size();
  10. i++;
  11. }
  12. _ht[index]._kv = kv;
  13. _ht[index]._state = EXIST;
  14. _n++;
  15. }

答案是size,因为用vector的[ ]的时候,是只能访问size的部分的,假如是capacity,算出来的值可以就大于size了,就无法访问了

插入问题2 

是不是有疑惑,当size==0的时候怎么处理?那就要扩容了

还有什么情况下要扩容?

在载荷因子较大的情况下要进行扩容

插入问题3

怎么扩容?

你们的脑瓜子一想简单啦,直接用vector的reserve就好啦,不对的,vector的reserve是扩大了capacity,size没有变的

我们可以用resize进行扩容,risize既扩容又初始化,size改变了

再把旧表数据移到新表

  1. bool insert(const pair<K,V>& kv)
  2. {
  3. if (Find(kv.first))
  4. return false;
  5. if (_ht.size()==0||_n * 10 / _ht.size() >= 7)
  6. {
  7. int newsize = _ht.size() == 0 ? 10 : _ht.size() * 2;
  8. HashTable<K, V> newht;
  9. //对原来insert进行复用
  10. newht._ht.resize(newsize);
  11. //遍历旧表,来初始化新表
  12. for (auto& data : _ht)
  13. {
  14. if (data._state == EXIST)
  15. {
  16. newht.insert(data._kv);
  17. }
  18. }
  19. _ht.swap(newht._ht);
  20. }
  21. //线性探测
  22. int hashi = kv.first% _ht.size();
  23. int index = hashi;
  24. int i = 1;
  25. while (_ht[index]._state ==EXIST)
  26. {
  27. index = hashi + i;
  28. index %= _ht.size();
  29. i++;
  30. }
  31. _ht[index]._kv = kv;
  32. _ht[index]._state = EXIST;
  33. _n++;
  34. return true;
  35. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/787106
推荐阅读
相关标签
  

闽ICP备14008679号