1. 程式人生 > >離散化學習筆記

離散化學習筆記

介紹

離散化是應用於當結果與具體數值無關時,將較大資料按次序變為較小資料的一種演算法。

用科學的語言說,就是 把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

說白了就是把較大資料編成一個個較小,但是大小關係不變的數。

也就是這樣子:

原始資料 離散化後
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;
}