当前位置:   article > 正文

C++——哈希结构

C++——哈希结构

1.unordered系列关联式容器

本节主要介绍unordered_map和unordered_set两个容器,底层使用哈希实现的

unordered_map

1.unordered_map是储存<key,value>键值对的关联式容器,其允许通过key快速查找到对应的value,和map非常相似,但是底层实现完全不同

2.unoredered_map没有对<key,value>进行排序,而是映射一个对象,其内容与其键相关联,键和映射值的类型可能不同

2.底层结构

unordered系列的关联式容器之所以效率比较高,是因为底层实现了哈希结构

哈希概念

构造一种储存结构,通过某种函数使元素的储存位置与他的关键码建立一一映射的关系,那么在查找该元素的时候很快就能找到

这个顺序表叫做哈希表,但是还有一个问题,如果插入44会出现什么问题?

哈希冲突

不同关键字通过相同的哈希函数计算出相同的哈希地址,这种现象称为哈希冲突

这种情况我们通常用开放定址法和哈希桶解决

常见哈希函数

常用的除留余数法

就是用我们插入的数据模上哈希表的长度,得出的余数,就是我们得到的插入位置的下标;

哈希表什么时候扩容

开放定址法实现哈希

  1. #pragma once
  2. #include<vector>
  3. template<class K>
  4. struct HashFunc
  5. {
  6. size_t operator()(const K& key)
  7. {
  8. return (size_t)key;
  9. }
  10. };
  11. //特化
  12. template<>
  13. struct HashFunc<string>
  14. {
  15. size_t operator()(const string& key)
  16. {
  17. size_t hash = 0;
  18. for (auto ch : key)
  19. {
  20. hash *= 131;
  21. hash += ch;
  22. }
  23. return hash;
  24. }
  25. };
  26. namespace open_address
  27. {
  28. enum State
  29. {
  30. EXIST,
  31. EMPTY,
  32. DELETE
  33. };
  34. template<class K, class V>
  35. struct HashData
  36. {
  37. pair<K, V> _kv;
  38. State _state = EMPTY;
  39. };
  40. template<class K, class V, class Hash = HashFunc<K>>
  41. class HashTable
  42. {
  43. public:
  44. HashTable()
  45. {
  46. _tables.resize(10);
  47. }
  48. bool Insert(const pair<K,V>& kv)
  49. {
  50. if (Find(kv.first))
  51. {
  52. return false;
  53. }
  54. //扩容
  55. if (_n * 10 / _tables.size() >= 7)
  56. {
  57. HashTable<K, V> newHT;
  58. newHT._tables.resize(_tables.size() * 2);
  59. for (size_t i = 0; i < _tables.size(); i++)
  60. {
  61. if (_tables[i]._state == EXIST)
  62. {
  63. newHT.Insert(_tables[i]._kv);
  64. }
  65. }
  66. _tables.swap(newHT._tables);
  67. }
  68. Hash hs;
  69. size_t hashi = hs(kv.first) % _tables.size();
  70. while (_tables[hashi]._state ==EXIST)
  71. {
  72. ++hashi;
  73. hashi %= _tables.size();
  74. }
  75. _tables[hashi]._kv = kv;
  76. _tables[hashi]._state = EXIST;
  77. ++_n;
  78. return true;
  79. }
  80. HashData<K, V>* Find(const K& key)
  81. {
  82. Hash hs;
  83. size_t hashi = hs(key) % _tables.size();
  84. while (_tables[hashi]._state != EMPTY)
  85. {
  86. if (_tables[hashi]._state == EXIST &&
  87. _tables[hashi]._kv.first == key)
  88. {
  89. return &_tables[hashi];
  90. }
  91. ++hashi;
  92. hashi %= _tables.size();
  93. }
  94. return nullptr;
  95. }
  96. bool Erase(const K& key)
  97. {
  98. HashData<K, V>* ret = Find(key);
  99. if (ret == nullptr)
  100. {
  101. return false;
  102. }
  103. else
  104. {
  105. ret->_state = DELETE;
  106. --_n;
  107. return true;
  108. }
  109. }
  110. private:
  111. vector<HashData<K, V>> _tables;
  112. size_t _n = 0;
  113. };

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号