离散化——化不可能为可能(STL)
所谓离散,就是化连续为不连续,使得我们某种枚举的方法得以实现。
当然,离散还能够帮助我们将某些数据范围很大达到2^16,但是这些数据并不多(例如才1000+),我们可以把数据进行离散,保持他们之间的相对大小。
例如这里有几个数:4865845,146384512,598745,896561634,4865845
我们先对数进行排序:598745,4865845,4865845,146384512,896561634
离散后就变成了:0,1,1,2,3(1,2,2,3,4也行)
我们不仅可以将很大的数据进行离散,对于要整型数据结构的,但我们操作的数据是小数的,我们也可以对其进行离散。
因此在这里 离散就是维护他们的相对大小,当然,保留原来的数据,我们可以将离散后的值和离散前的值进行相互映射。
离散的主要步骤:
1.排序
2.去重
3.离散
这里我们可以运用STL,从而实现代码短,易编写。
假设我们有三个数据:a[n],b[n],rank[n];(其中a[n]为将要离散的数组,b[n]为a[n]的备份,rank[n]用于排序后去重提供离散化的值(排名),n为数据个数)
sort(rank,rank+n);//先从小到大排序
int size=unique(rank,rank+n)-rank;//unique函数可去掉连续重复的字母,其中返回值是rank数组去重后实际最后一个数字的地址(具体可以百度一下)-rank中的rank指的是rank[0]的地址,可以联想快排里面rank+n的用法 这里size就是去重后数组的长度
for(int i=0;i<n;i++)
a[i]=lower_bound(rank,rank+size,a[i])-rank;//lower_bound返回第1个不小于a[i]的值的指针,离散后序列为0, 1, 2, ..., size - 1,如果想要1,2,3,...,size的话就+1或者用upper_bound,upper_bound返回第1个大于a[i]的值的指针 如果数组是从1开始的而不是0的话 只需要将rank改为(rank+1) 即
sort(rank+1,rank+n+1);
int size=unique(rank,rank+n)-(rank+1);
for(int i=0;i<n;i++)
a[i]=lower_bound(rank,rank+size,a[i])-(rank+1);
关于离散化后查询的问题
1.离散后的值为x,那么离散前的值就是rank[x];
2.离散前的下标为i,那么对应的离散后的值是a[i];
3.离散前的值为x,那么根据上面离散的方法即可求得离散后的值就是a[lower_bound(rank,rank+size,x)-rank]
离散是一种思想,有时候会有意想不到的效果。
离散化——化不可能为可能(STL)的更多相关文章
- Mayor's posters(线段树+离散化POJ2528)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51175 Accepted: 14820 Des ...
- POJ 2528 Mayor's poster
主要是参考了这个博客 地址戳这儿 题目大意:n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看 ...
- SPOJ:Collecting Candies(不错的DP)
Jonathan Irvin Gunawan is a very handsome living person. You have to admit it to live in this world. ...
- Sona && Little Elephant and Array && Little Elephant and Array && D-query && Powerful array && Fast Queries (莫队)
vjudge上莫队专题 真的是要吐槽自己(自己的莫队手残写了2个bug) s=sqrt(n) 是元素的个数而不是询问的个数(之所以是sqrt(n)使得左端点每个块左端点的范围嘴都是sqrt(n)) 在 ...
- Hash 算法与 Manacher 算法
目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...
- R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 分箱法在实际案例操作过程中较为常见,能够将一些 ...
- 数据离散化 ( 以及 stl 中的 unique( ) 的用法 )+ bzoj3289:Mato的文件管理
http://blog.csdn.net/gokou_ruri/article/details/7723378 ↑惯例Mark大神的博客 bzoj3289:Mato的文件管理 线段树求逆序对+莫队 ...
- UVa 221 Urban Elevations 城市正视图 离散化初步 无限化有限
转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 题目大意: 题目传送门:UVa 221 Urban Elevations 给出城市中建筑物的x, ...
- HDU2883 kebab(最大流判断满流 + 离散化 + 区间化点)
[题意]: 有一个烤箱,烤箱在一个时刻最多考M个肉串,N个顾客,每个顾客有属性s,n,e,t s是来的时间,n是想要的肉串数量,e是最晚离开的时间,t是烤的时间(几分熟). 顾客的烤肉可以分开烤,比如 ...
随机推荐
- sql 中 ALTER 和 UPDATE 的区别
alter 是DDL语句,是修改数据库中对象(表,数据库,视图..)的语句. 如需在表中添加列,请使用下面的语法: ALTER TABLE table_name ADD column_name dat ...
- input text 去掉标签下拉提示autocomplete
autocomplete 属性 autocomplete 属性规定输入字段是否应该启用自动完成功能. 自动完成允许浏览器预测对字段的输入.当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在 ...
- Java教程到处都是,究竟怎样能学好Java?
学习Java如何入门?学习教程要点是什么?如何精通?做好以下这些点,入门更快,掌握Java更轻松. Java必备基础知识 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EE ...
- Adreno Profiler连接安卓手机profile第三方app渲染过程
1,下载Android SDK,adb在Android SDK/platform-tools下. 2,添加adb环境变量:http://www.cnblogs.com/xwlyun/archive/2 ...
- CentOS下安装man手册
1.命令: yum install man 后发现,有的函数仍然没有.经过一番查找,原来安装的不完全,还要执行下面命令: yum install man-pages 2.总结:cengos下安装man ...
- PCIe to AXI Translation——PCIe 内存空间到AXI内存空间的转换
PCIe to AXI Translation——PCIe 内存空间到AXI内存空间的转换 UltraScale系列芯片包含PCIe的Gen3 Integrated Block IP核在内的多种不同功 ...
- 3.selenium模块
本节内容: 介绍 安装 基本使用 选择器 等待元素被加载 元素交互操作 其他 项目练习 一.介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行Ja ...
- python学习之urllib.parse.unquote()
urllib.parse.unquote(string,encoding ='utf-8',errors ='replace') 用同一个字符换成%xx转义.相当于JS中的urldecode(),对u ...
- 0052 Spring MVC入门--环境搭建--第一个入门示例
Spring MVC是什么 Spring是一个框架,包括了MVC.IoC.AOP等等组件 MVC是一种思想,并非Spring框架独有,全称是Model.View.Controller,即模型.视图.控 ...
- RandomUser 网站介绍
RandomUser 网站介绍 tools api 介绍 使用 结果 API 错误 请求多个用户 指定性别 密码 种子 格式 使用早期版本 国家 页码 包含/不包含字段 杂项 结束语 介绍 在 201 ...