介绍
离散化是应用于当结果与具体数值无关时,将较大数据按次序变为较小数据的一种算法。
用科学的语言说,就是 把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
说白了就是把较大数据编成一个个较小,但是大小关系不变的数。
也就是这样子:
原始数据 | 离散化后 |
---|---|
12 | 1 |
32 | 3 |
18 | 2 |
12 | 1 |
有些人说:那用一个map不就行了么???
蓝鹅 map 的常数真的大 尽量别用了,而且,这里是在讲离散化,不是map,所以我们继续看——
过程
离散化的过程真的很简单。一般来说只有那么3步~
1.排序 2. 去重 3.映射
排序 就是把数据放到另外一个数组排一遍 sort~
去重 用unique就可以了~
映射 修改原来数组的数据 一般用lower_bound实现 即二分找出某个元素的排名,将该元素赋为其排名即可。
很简单吧?其实这就是STL三重奏
代码
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 100005
int n, m;
int a[MAXN], b[MAXN];
int main(){
scanf( "%d", &n );
for ( int i = 1; i <= n; ++i ) scanf( "%d", &a[i] ), b[i] = a[i];
sort( b + 1, b + n + 1 );//STEP ONE
m = unique( b + 1, b + n + 1 ) - b - 1;//STEP TWO
for ( int i = 1; i <= n; ++i ) a[i] = lower_bound( b + 1, b + m + 1 ) - b;//STEP THREE
for ( int i = 1; i <= n; ++i ) printf( "%d%c", a[i], " \n"[i == n] );
return 0;
}