C++STL哈希表

在这里插入图片描述

哈希思想

很多人认为哈希表和哈希是同一个东西,但实际上,哈希是一种思想,而哈希表则是通过哈希思想实现的一种数据结构。
实际上通过哈希思想实现的数据结构有很多,如布隆过滤器,位图,哈希表等。

哈希表的两种实现

哈希表是通过一个哈希函数,从key快速得到value,而通过哈希函数可能导致一个value映射到同一个key,为了解决该问题,有两种方法。
1).开放地址法。

开发地址法通过当映射到同一个位置时,则可以选择下一个没有被占据的位置插入。
开发地址法不能将整个哈希表所有元素填满,否则可能导致找不到插入位置,所以开发地址法存在一个负载因子 = 哈希表已有元素 / 哈希表容器。
当当前的哈希因子大于设置的哈希因子时,则就要进行扩容了。
1).开放地址法缺点:
开放地址法若其中元素过多,则可能导致查询的时间复杂度增加。
2).开放地址法的注意事项
扩容需要让所有元素重新插入新哈希表中,扩容可以使得哈希冲突减少。

2).哈希桶。

哈希同通过哈希函数将相同映射的元素挂在同一个key值下
在这里插入图片描述
在STL库中,哈希表使用的也是该种方法,此种方法如果某个key值一直被映射,则会导致该key值下链接了很多元素,这会导致查询某个元素,可能会导致O(n)的时间复杂度,为了解决该问题,则可以通过将每个key下挂的链表换成红黑树,减少时间复杂度。

哈希函数

哈希函数就是从value 到 key的映射函数,一个好的哈希函数,可以使得哈希冲突的次数减少。
常见的哈希函数。
1).除留取余法。2).对于字符串类型,可以累加字符串的每一个字符。

STL中的哈希表

在这里插入图片描述
哈希函数常用的接口如下。
1).在这里插入图片描述[]重载运算符,其中复用了insert函数,该接口比insert函数好用。
2).
在这里插入图片描述
size函数返回哈希表中key的种类。
3).
在这里插入图片描述
count函数用于检测某个key是否存在,如果存在,则返回1,否则返回0。
4).
在这里插入图片描述
clear函数可以清空哈希表。

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在C++中实现哈,可以通过以下步骤进行: 1. 定义一个哈函数,将键(key)映射到哈中的索引。哈函数应该是高效的,尽可能地减少哈冲突。 2. 定义一个数组,用于存储哈中的元素(键值对)。 3. 在数组中插入一个元素时,先使用哈函数计算出该元素的索引,然后将元素插入到该索引处。如果该索引处已经有元素,则需要解决哈冲突,例如使用开放寻址法或链法。 4. 在数组中查找一个元素时,同样使用哈函数计算出该元素的索引,然后在该索引处查找元素。如果该索引处没有元素,则说明该元素不在哈中。 以下是一个简单的示例代码,演示了如何实现一个基本的哈,其中使用了开放寻址法来解决哈冲突: ```c++ #include <iostream> const int TABLE_SIZE = 128; class HashTable { private: struct Node { int key; int value; bool is_deleted; // 标记是否被删除 }; Node table[TABLE_SIZE]; // 哈函数 int hash(int key) const { return key % TABLE_SIZE; } public: HashTable() { for (int i = 0; i < TABLE_SIZE; ++i) { table[i].key = -1; table[i].value = -1; table[i].is_deleted = false; } } // 插入元素 void insert(int key, int value) { int index = hash(key); while (table[index].key != -1 && table[index].is_deleted == false) { // 线性探测 index = (index + 1) % TABLE_SIZE; } table[index].key = key; table[index].value = value; table[index].is_deleted = false; } // 查找元素 int find(int key) const { int index = hash(key); while (table[index].key != -1) { if (table[index].key == key && table[index].is_deleted == false) { return table[index].value; } index = (index + 1) % TABLE_SIZE; } return -1; } // 删除元素 void remove(int key) { int index = hash(key); while (table[index].key != -1) { if (table[index].key == key && table[index].is_deleted == false) { table[index].is_deleted = true; return; } index = (index + 1) % TABLE_SIZE; } } }; int main() { HashTable ht; ht.insert(1, 10); ht.insert(2, 20); ht.insert(3, 30); std::cout << ht.find(2) << std::endl; // 输出 20 ht.remove(2); std::cout << ht.find(2) << std::endl; // 输出 -1 return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值