31 lines
1.8 KiB
Markdown
31 lines
1.8 KiB
Markdown
|
|
## $Map$专题
|
|||
|
|
|
|||
|
|
**$Q_1:$$Map$用在什么场景?**
|
|||
|
|
答:以$O(1)$时间高速的查询到某个键值。
|
|||
|
|
|
|||
|
|
**$Q_2:$数组的桶也能做类似的操作,为什么还需要$Map$?**
|
|||
|
|
答:因为数组桶的上限受内存容量限制
|
|||
|
|
一般$OI$考试的题目的
|
|||
|
|
时/空限制:$1s/64MB$ 或 时/空限制:$2s/128MB$
|
|||
|
|
|
|||
|
|
以$128MB$为例,$128M=131072KB=134217728$字节
|
|||
|
|
$int=4$字节,开$int$型变量的一维数组最多是$3$千万$=3∗10^7$,但考虑到程序运行不可能把内存都分配给一个数组,一般最大就是$1e6$。
|
|||
|
|
|
|||
|
|
**$Q_3$:能不能举个例子,说明数组桶不行,而$Map$可以?**
|
|||
|
|
答:假设有$n$个元素,每个元素的数据范围是全部整数,但输入只有$10000$个,让你统计一下元每个元素出现的次数。此时,值域太大,不可能用数组桶开一个$INT\_MAX$大小的数组,但数量不是特别多,是$10000$个,这样用$Map$最合适。
|
|||
|
|
|
|||
|
|
**$Q_4$:$Map$据说还有两种,有什么区别?**
|
|||
|
|
答:$Map$在$C++$中确实有两两种实现,一种是$unordered\_map$,一种是$map$。故名思义,$unordered\_map$是无序$MAP$,哈希表实现,而$map$是有序$MAP$,二叉树实现。
|
|||
|
|
|
|||
|
|
**区别**:
|
|||
|
|
- $unordered\_map$运行速度更快,不会$TLE$,时间复杂度$O(1)$
|
|||
|
|
- $map$运行速度稍慢,时间复杂度:$O(logn)$
|
|||
|
|
但一般现在$CSP-J$,$CSP-S$中用$MAP$应该也够用
|
|||
|
|
> **参考文档**
|
|||
|
|
> [加强理解 unordered_map (面向竞赛)](https://blog.csdn.net/weixin_72391681/article/details/141476913)
|
|||
|
|
>
|
|||
|
|
|
|||
|
|
**$Q_5$:那是不是用数组就一定不可以实现上面的场景了?**
|
|||
|
|
答:当然不是,数组是一切数组结构的基础。
|
|||
|
|
这就需要排序+去重+二分查找了,举个例子:
|
|||
|
|
>[AcWing 802. 区间和](https://www.cnblogs.com/littlehb/p/15241960.html)
|