您的位置:首页 > 其它

序列的 离散化

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++程序编写中的一个经典问题,同时,也是一种对题目的技巧处理手段,对于大数据问题可以通过离散化来减少数据范围。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: