介绍

离散化是应用于当结果与具体数值无关时,将较大数据按次序变为较小数据的一种算法。

用科学的语言说,就是 把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

说白了就是把较大数据编成一个个较小,但是大小关系不变的数。

也就是这样子:

原始数据 离散化后
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;
}