序列的 离散化
2016-07-21 08:38
260 查看
【问题描述】
对于一个数据元素很大的序列:A[1],A[2],…,A
,我们在处理这个序列时,往往只会关心序列中元素的大小关系。这时候为了处理方便,可把序列映射为1..n范围内的数,其中最小的元素映射为1,第2小的数映射为2,……。例如:
原 序 列:19827345 2000000053 73925 98203456 73925 19827345
映射序列: 2 4 1 3 1 2
由此可以看出,映射序列于原序列元素间的大小关系是等价的,在这里我们把“映射序列”又称为“名次序列”。
所以,离散序列实质就是原序列每个元素用它的名次代替(相同的元素名次相同),离散化就是要得到序列的名次数组。
【输入格式】
第1行,为整数n,表示序列有n个实数。第2行包含n个实数,表示序列A[1]..A
。
【输出格式】
包含n个整数,与原序列等价的名次序列。
【输入样例】
6
10.5 8.1 9.22 3.33 6.23 8.1
【输出样例】
5 3 4 1 2 3
【数据范围】
1<=n<=100000。A[i]在double范围内。
【来源】
Mr_He原创
这个问题是C++程序编写中的一个经典问题,同时,也是一种对题目的技巧处理手段,对于大数据问题可以通过离散化来减少数据范围。
代码如下:
对于一个数据元素很大的序列:A[1],A[2],…,A
,我们在处理这个序列时,往往只会关心序列中元素的大小关系。这时候为了处理方便,可把序列映射为1..n范围内的数,其中最小的元素映射为1,第2小的数映射为2,……。例如:
原 序 列:19827345 2000000053 73925 98203456 73925 19827345
映射序列: 2 4 1 3 1 2
由此可以看出,映射序列于原序列元素间的大小关系是等价的,在这里我们把“映射序列”又称为“名次序列”。
所以,离散序列实质就是原序列每个元素用它的名次代替(相同的元素名次相同),离散化就是要得到序列的名次数组。
【输入格式】
第1行,为整数n,表示序列有n个实数。第2行包含n个实数,表示序列A[1]..A
。
【输出格式】
包含n个整数,与原序列等价的名次序列。
【输入样例】
6
10.5 8.1 9.22 3.33 6.23 8.1
【输出样例】
5 3 4 1 2 3
【数据范围】
1<=n<=100000。A[i]在double范围内。
【来源】
Mr_He原创
这个问题是C++程序编写中的一个经典问题,同时,也是一种对题目的技巧处理手段,对于大数据问题可以通过离散化来减少数据范围。
代码如下:
#include<cstdio> #include<cstring> #include<set> #include<map> #define maxn 100005 using namespace std; int n; double a[maxn]; map<double,int>mp; map<double,int>::iterator it; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf",&a[i]); mp[a[i]]=1; } int id=1; for(it=mp.begin();it!=mp.end();it++) it->second=id++; for(int i=1;i<=n;i++) printf("%d ",mp[a[i]]); return 0; }
相关文章推荐
- LintCode 面试题 旋转字符串
- 夏天你吃它了吗?
- php_lang_ref:classes and objects>>class abstraction
- NYOJ:2 括号配对问题(初识栈)
- 清除xcode 缓存文件
- POJ2769 Reduced ID Numbers[同余]
- C# 读取EXCEL文件的三种经典方法
- 走遍中国 —— 铁路交通网
- [AC自动机 fail树 树状数组] BZOJ 2434 [NOI2011] 阿狸的打字机
- SQLite数据库
- C# 读取EXCEL文件的三种经典方法
- C# 读取EXCEL文件的三种经典方法
- C# 读取EXCEL文件的三种经典方法
- EXCEL排序
- 【hdoj4548】美素数
- Android安卓Adapter理解
- Elasticsearch集群入门-基本操作
- 正则表达式
- CodeForces 388C Fox and Card Game 解题报告
- [学习笔记]for、while、do-while 流程控制