MAP的底层原理

Map数据结构

Map也是容器的一种,那么我们以前看到的每一种容器,都有响应的数据结构,例如数组是一组连续的存储空间,链表是无序的,包含指针域和值域的容器。

Map的每一个元素叫做键值对,所谓键值对其实就是 “键” 和 “值” 组成的一对。

map的主要实现类是hashmap和treemap,在java开发过程中主要用到的是hashmap。下面简单介绍一下hashmap原理
数组

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

链表

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

哈希表

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组”
  在这里插入图片描述

hashmap底层原理
HashMap保存数据的过程为:首先判断key是否为null,若为null,则直接调用putForNullKey方法。若不为空则先计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置处有元素,则通过比较是否存在相同的key,若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)。若table在该处没有元素,则直接保存。

hashmap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小×loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16×0.75=12的
时候,就把数组的大小扩展为2×16=32,即扩大一倍,然后重新计算每个元素在数组中的位置。

### C++ 中 `map` 的数据结构及其实现原理 #### 1. 基本概念 在 C++ 标准库中,`std::map` 是一种关联容器,它存储键值对,并按照键的排序顺序排列。为了高效地支持插入、删除和查找操作,`std::map` 使用红黑树(Red-Black Tree)来实现底层数据结构。 #### 2. 红黑树特性 红黑树是一种自平衡二叉搜索树,在最坏情况下也能保证 O(log n) 时间复杂度的操作效率。这种树通过特定的颜色属性和旋转机制保持平衡状态,从而确保性能稳定[^1]。 #### 3. 模板定义与成员变量 查看 `libstdc++-v3/include/bits/stl_map.h` 文件中的源码可以发现: ```cpp private: /// This turns a red-black tree into a [multi]map. typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<value_type>::other _Pair_alloc_type; typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type; /// The actual tree structure. _Rep_type _M_t; ``` 这里 `_M_t` 成员代表实际使用的红黑树实例,用于保存所有的元素;而其他部分则负责配置该树的具体参数设置,比如分配器类型以及如何提取键值等细节[^2]。 #### 4. 插入过程解析 当向 `std::map` 添加新元素时,程序会先尝试找到合适的位置并执行相应的调整动作以维持红黑树性质不变。具体来说就是沿着路径向下比较直至遇到空位为止,之后再根据情况决定是否需要进行颜色翻转或旋转变换来恢复平衡条件。 #### 5. 查找逻辑说明 对于给定的目标键 k ,算法将从根节点出发沿路逐层深入直到命中目标或者到达叶结点位置结束。由于采用了有序排列方式,因此每次迭代都能排除一半以上的候选区域,使得整个流程非常快速有效。 #### 6. 删除处理方法 移除指定项同样依赖于上述提到过的自我修复能力——即每当某个子树被裁剪掉以后都会立即触发一系列必要的修正措施,以此保障整体形态始终处于理想范围内。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值