(转)离散化:两种离散化方式详解
引入
离散化,就是把一些很离散的点给重新分配。
举个例子,如果一个坐标轴很长(>1e10),给你1e4个坐标,询问某一个点,坐标比它小的点有多少。
很容易就知道,对于1e4个点,我们不必把他们在坐标轴上的位置都表示出来,因为我们比较有多少比它小的话,只需要知道他
们之间的相对大小就可以,而不是绝对大小,这,就需要离散化。
而离散化又分为两种,分为的两种是对于重复元素来划分的。第一种是重复元素离散化后的数字相同,第二种就是不同。
第一种
其实就是用一个辅助的数组把你要离散的所有数据存下来。
然后排序,排序是为了后面的二分。
去重,因为我们要保证相同的元素离散化后数字相同。
再用二分把离散化后的数字放回原数组。
代码如下。
#include<algorithm> // 头文件
//n 原数组大小 num 原数组中的元素 lsh 离散化的数组 cnt 离散化后的数组大小
int lsh[MAXN] , cnt , num[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i]);lsh[i] = num[i];
}
sort(lsh+1 , lsh+n+1);
cnt = unique(lsh+1 , lsh+n+1) - lsh - 1;
for(int i=1; i<=n; i++)num[i] = lower_bound(lsh+1 , lsh+cnt+1 , num[i]) - lsh;
注意事项:
1.去重并不是把数组中的元素删去,而是重复的部分元素在数组末尾,去重之后数组的大小要减一
2.二分的时候,注意二分的区间范围,一定是离散化后的区间
3.如果需要多个数组同时离散化,那就把这些数组中的数都用数组存下来
第二种
第二种方式其实就是排序之后,枚举着放回原数组
用一个结构体存下原数和位置,按照原数排序
我结构体里面写了个重载,也可以写一个比较函数
最后离散化后数在rank[]里面
#include<algorithm>
struct Node {int data , id;bool operator < (const Node &a) const {return data < a.data;}
};
Node num[MAXN];
int rank[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i].data);num[i].id = i;
}
sort(num+1 , num+n+1);
for(int i=1; i<=n; i++)rank[num[i].id] = i;
侵权删
(转)离散化:两种离散化方式详解相关推荐
- PCBA加工中常见的两种焊接方式详解
PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...
- redis的两种持久化方式详解
一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...
- oracle mysql连接池配置文件_数据库连接池两种配置方式详解
数据库连接池: 负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接 ...
- 字典树(Trie树)两种实现方式详解
目录 字典树介绍 字典树二维数组实现 实现思路 代码实现 字典树节点链表实现 实现思路 代码实现 字典树介绍 字典树,又称单词查找树. 其根节点不包含字符,除根节点外每一个节点都只包含一个字符: 从根 ...
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- linux apache两种工作模式详解
apache两种工作模式详解 刚接触这两个配置时很迷糊,全部开启或全部注释没有几多变化.今天搜索到这么一篇讲得还不错的文章,看了几篇,还是不能完全记住,做一个收藏. 空闲子进程:是指没有正在处理请求的 ...
- @Resource,@Autowired,@Inject3种注入方式详解
转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...
- python类的命名空间_Python之关于类变量的两种赋值区别详解
我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...
- oracle数据库按日期查询,关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解...
关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解 Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设 ...
- C++的三种继承方式详解
文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...
最新文章
- 从工程中删除Cocoapods
- Collections.toArray方法使用的坑
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)
- hugo_如何将Hugo用于教室的开源CMS
- centos 编译内核至2.6.39.4
- Python SciPy教程
- 阿里云盘秒传使用方法
- 禁用计算机中的u盘功能,电脑设置禁用U盘的四大方法 怎么让电脑无法使用U盘...
- 基于Python的拉勾网的模拟登录获取cookie
- “报告星”自动报告生成系统介绍
- 火爆全网的 “蚂蚁牙黑” 特效 今天你也可以做。
- matlab2018a出现error8怎么办
- 数据文件储存服务器入什么科目,云服务器会计上入什么科目
- 跟着狂神学Docker(精髓篇)
- XMLElement,XMLDocument 用法
- 视频导入pr一卡一卡的(解决)
- 将登记照图片尺寸宽高文件大小进行调整修改的工具
- 揭秘国漫《武动乾坤》制作幕后 动作戏竟然真人演
- 花半年的时间储备自己
- dsa的java实现_Java数字签名算法DSA实例详解