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

离散化模板

假设需要存储一些键值对,它们的 key 分别为{1, 8, -10, 499, 231, 76, 21747483647}——一组无序且边界极大的数

直接存数组是不行的 arr[21747483647]、arr[-10] 都不合理

如果直接使用 map 去存,每次插入都是一次树型的调整,虽然大致是 nlogn,但是肯定要大一点的。对于只在初始化阶段建表,后期不再改动的情况,是挺浪费的

这个时候使用离散化是更好的方法

// 把 pairs 按照 key 递增顺序排序,cmp 自己实现
sort(pairs, pairs + n, cmp);

for (int i = 0; i < n; i++){
  v[i] = pairs[i].value;
}

for (int i = 0; i < n; i++){
  k[i] = pairs[i].key;
}

使用时很方便,比如要找 key=499 对应的数据,只需要

v[lower_bound(k, k + n, 499) - k];

可以 define 一个宏,用起来方便

#define KLOC(X) (lower_bound(k, k + n, (X)) - k)

lower_bound()是纯二分,logn,所以说这个也是 nlogn,比 map 快的 nlogn

vector 版本:

sort(pairs.begin(), pairs.end(), cmp);
...
v[lower_bound(k.begin(), k.end(), 499) - a.begin()];

相关文章:

  • 一种加权变异的粒子群算法-附代码
  • 带符号整数的除法与余数
  • Spring Cloud集成Dubbo实现RPC调用
  • 怎么开发自己的NFT平台
  • Android Context
  • 架构师的 36 项修炼第10讲:架构实战案例分析
  • 力扣每日一题-第63天-867. 转置矩阵
  • java基于ssm+vue的考研信息查询系统 elementui
  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[29]总结
  • C++设计模式之工厂模式(创建型模式)
  • 姿态分析开源工具箱MMPose使用示例:2d手势估计
  • MySQL分页查询
  • 第22篇 基础 (二十二)手把手教学 Qt 操作 ini 文件(详解)
  • Linux CentOS 8(用户管理)
  • 算法---找出数组中的所有孤独数字(Kotlin)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【知识碎片】第三方登录弹窗效果
  • Consul Config 使用Git做版本控制的实现
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • MobX
  • php ci框架整合银盛支付
  • React-flux杂记
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 码农张的Bug人生 - 初来乍到
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前嗅ForeSpider教程:创建模板
  • 悄悄地说一个bug
  • 使用API自动生成工具优化前端工作流
  • 事件委托的小应用
  • 数据结构java版之冒泡排序及优化
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 追踪解析 FutureTask 源码
  • (C语言)共用体union的用法举例
  • (层次遍历)104. 二叉树的最大深度
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)WLAN定义和基本架构转
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)视频码率,帧率和分辨率的联系与区别
  • .aanva
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NetCore项目nginx发布
  • .Net的DataSet直接与SQL2005交互
  • .NET值类型变量“活”在哪?
  • /3GB和/USERVA开关
  • [Angular 基础] - 表单:响应式表单
  • [Angularjs]ng-select和ng-options