当前位置: 首页 > news >正文

二维下标极大数组(二维 map)

在遇到某些题的时候,我们会遇到下标 \(x,y\) 范围较大(如\(10^6\))但点数较小(比如就 \(10^5\) 个)的情况。如果只有一个 \(x\) 的话我们会选择使用 map 或者 unordered_map 来解决,但是如果是二维,这就有些难办了。

pair 转化(自写 hash)

因为点实际上很少,只不过是下标的范围太大了,我们没必要真的开那么大的数组,只需要想办法给这个两个下标搞出一个唯一的标记即可。使用 pair 就可以达到这一点。

因此我们可以使用 pair 作为 map 的第一键值,从而实现二维下标的一维化。

优点是简洁,易写。

缺点是 unordered_map 无法使用 pair 作为第一键值,因为 unordered_map 本身没有 pair 的 hash 方法,因此如果想给 unordered_map 使用就只能自写 hash,但是这很困难、很麻烦,而如果不用 unordered_map 的话,一般情况下就只能使用 map,而 map 带有 \(\operatorname O(\log n)\) 的排序,而我们往往不需要这个,排序,这就会拖慢我们的程序。对于时间不友好。

总的看,这种办法不怎么好。

二维下标一维化

即使用进制的办法,把二维的下标转化为一维的一个数里面去。比如:如果 \(x,y \in [1, N]\),那么 \(id = x \times N + y\),通过这种方式,把两个 \(x,y\) 化成一个数字。通过这种方式,就可以用一维的 unordered_map 去存储二维下标,兼顾了时间和空间,而且简单。

缺点也是有的,就是这个 \(id\) 的范围不能太大,不能把 longlong 给爆掉(unorderd_map 无法使用 int128 作为第一键值)。因此如果这个 \(x,y\) 的范围不超过 \(10^9\) 的话,这种办法是很棒的。(一般的 \(x,y\) 范围也不会超过 \(10^9\),因此这个方法基本够用)

使用字符串 string 作为第一键值

这个方法和 pair 类似,但是好处的 unordered_map 可以使用,但相对的是使用不算方便,且效率相对较低(一般比二维下标一维化要慢上个小 \(10\) 倍)。

拼接字符串是很难受的,而且直接拼接会出现冲突情况。如 \(x = 24, y= 123\)\(x = 242, y = 23\) 这两组在拼接后的字符串都是 \(24123\),因此不算是一种好办法。

map 嵌套

即把 map 的第二键值设为另一个 map,从而实现二维 map。

因为 map 依靠第一键值进行排序,所以第一键值必须可以对比大小,而当另一 map 在第二键值,就相当于当前 map 里面存的还是 map,这个 map 可以再次使用 [] 进行索引,就可以像使用二维数组一样使用 map,如下:

map<int, map<int, int>> q;
q[x][y] = 1234;

这是一种真正的二维 map,通过这种方式,我们还可以实现三维、四维,或者 \(n\) 维。并且使用方便,对于下标完全没有范围限制,非常适合使用。

但是因为是基于 map(unordered_map 无法嵌套)所以在时间上会多出一个 \(\log n\),且嵌套 \(m\) 维,就需要多花 \(m \log n\) 的时间。因此在时间允许的情况下,可以使用这种方式,进行二维极大数组的存储。

http://www.hskmm.com/?act=detail&tid=15829

相关文章:

  • PySide6 之自定义弹出框
  • CF932E Team Work
  • HTTP3与HTTP2的性能对比
  • KubeSphere 社区版即将发布:开启云原生新篇章
  • 答题互动网页收藏
  • 芯脉:面向高速接口的SoC架构与完整性设计<3> - 教程
  • vscode插件开发,打包后不生效问题解决
  • streamlit构建dashboard
  • 力扣 338题 比特位计数
  • 企业服务管理是做什么的?-ManageEngine卓豪
  • 学习笔记_在Python中使用微信扫码功能(OpenCV WeChatQRCode)
  • 国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?
  • vscode中element-plus组件无属性提示
  • day07
  • minio集群搭建
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名餐饮菜谱应用需求洞察
  • 英伟达入资 11Labs,黄仁勋:语音 AI 带来情感、共情和联结;Qwen3-TTS-Flash:多语言,多音色,多方言丨日报
  • 深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例
  • Vue 包依赖总结
  • 笔记_OpenCV4.5.1新增微信QRCode解码功能
  • 数字孪生 + 碳痕追踪:MyEMS 给能源管理装了套 “全链路全景导航”
  • 空间复杂度和时间复杂度
  • 基于IOS26的iOS 内存分析与必要内存界定
  • 破局 “节能不省钱” 悖论:开源 EMS 生态如何让中小企业用 1/3 成本实现能效跃升?
  • iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)
  • P14062 【MX-X21-T7】[IAMOI R5] 若我不曾见过太阳 题解
  • unity确定性帧同步框架
  • 03-堆和栈
  • 视频汇聚平台EasyCVR如何构建智慧农业监控监管系统?
  • 一套自用的git提交规范,可清晰的识别到关联的任务/bug - 实践