1.8 KiB
1.8 KiB
$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$应该也够用
Q_5:那是不是用数组就一定不可以实现上面的场景了?
答:当然不是,数组是一切数组结构的基础。
这就需要排序+去重+二分查找了,举个例子: