哈希表理论基础

学习安排根据《代码随想录》~

什么是哈希表:根据关键码的值而进行访问的数据结构【官方解释】

个人总结:根据索引能找到对应的值。例子:数组就是一个哈希表。

哈希表有什么用:一般用来快速判断一个元素是否出现在集合里。

哈希表查找元素的时间复杂度:O(1)。

什么是哈希函数:通过特定的编码方式 将存储的哈希值 映射为哈希表的索引 的函数

什么是哈希碰撞:由于 需要存储的元素数量大于哈希表的大小,所以出现 不同哈希值 对应相同的索引,这一现象就叫做哈希碰撞。解决哈希碰撞的两种方法:拉链法、线性探测法。

 (a)拉链法                                                      (b)线性探测法

 拉链法:选择合适的哈希表大小,这样就不会因为数组空值太大而导致内存浪费,也不会因为链表太长导致查找时间浪费。

线性探测法:需要哈希表的大小大于数据元素的长度,需要找空位给冲突元素。

常见的哈希结构:

1.数组  2. set集合  3.map(映射)

底层实现原理:

PS: std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

  PS:std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的。

使用建议:

1. 解决哈希问题,优先使用 unordered_set,因为其查询和增删效率是最优的

2.如果需要有序插入,则用set;除此之外,如果还要数据可以重复,用multiset

3.map是一个<键 值>对的数据结构,map中对键的存储有限制,对 值没有。

4.红黑树的底层实现依旧可以来解决映射问题,所以同样称为哈希法。

5.hash_map、hash_set与unordered_set、unordered_map功能一样,但是后者被引入C++11标准库了,前者没有

总结:哈希法用来判断元素是否存在于某个集合中,但是牺牲了空间来换取查询时间。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值