離散化學習筆記
阿新 • • 發佈:2018-12-07
介紹
離散化是應用於當結果與具體數值無關時,將較大資料按次序變為較小資料的一種演算法。
用科學的語言說,就是 把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。
說白了就是把較大資料編成一個個較小,但是大小關係不變的數。
也就是這樣子:
原始資料 | 離散化後 |
---|---|
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; }