離散化思想
離散化
離散化適合在數據範圍很大但是又只使用部分數據的時候使用
例題 : AcWing 103
離散化函數:
sort(a, a + n);
for(int i = 0; i < n; i ++ ) {
if(i == 0 || a[i] != a[i-1]) {
b[m++] = a[i];
}
}
//排序後進行離散化
int query (int x) {
return low_bound(b, b + m, x) - b;
}
//查找數據映射到哪個整數上了
離散化概念:
離散化,把無限空間中有限的個體映射到有限的空間中去,以此提高演算法的時空效率。
通俗的說,離散化是在不改變數據相對大小的條件下,對數據進行相應的縮小。例如:
原數據:1,999,100000,15;處理後:1,3,4,2;
原數據:{100,200},{20,50000},{1,400};
處理後:{3,4},{2,6},{1,5};
— 來自 《百度百科》
簡單的來說就是一個把元素映射的過程,以減小數據範圍,方便進行計算。
常用在不關注數據本身的題目
小技巧:
//簡便的for循環
#define _for(i, a, b) for(int i = (a); i < (b); i ++ )
#define _rep(i, a, b) for(int i = (a); i <= (b); i ++ )
//sort的cmp函數
struct movie {
int first, second;
}
bool cmp(movie m1, movoie m2) {
if(m1.first == m2.first) return m1.second > m2.second;
return m1.first > m2.first;
}