整數離散化模板
阿新 • • 發佈:2021-02-18
技術標籤:離散化
整數離散化步驟
下面是將一組離散的資料(儲存的是原來資料的陣列下標) 離散化後對映到一個連續陣列,陣列中儲存的是原來的陣列下標
vector<int> alls ; // 儲存所有待離散化的值(此處為位置下標)
sort( alls.begin(), alls.end() ) // 將所有值排序
alls.erase( unique(alls.begin(), alls.end()), alls.end() ) ; // 去掉重複元素; unique函式返回的是去重後最後一個元素的後一個位置,erase刪掉此位置開始直到最後一個位置即end的所有元素
// 二分求出 x 離散化後的值(位置下標)
int find( int x ){ // x為原來的陣列下標
int l = 0, r = alls.size() - 1 ;
while(l<r){
int mid = l+r >> 1 ;
if( alls[mid] >= x ) r = mid ;
else l = mid + 1 ;
}
return r + 1 ; // 使下標從1開始, 1...n ; 返回離散化後的下標
}
// 擴充套件 : unique 函式的實現
vector<int>::iterator unique(vector<int> &a){
int j = 0 ;
for( int i = 0; i < a.size(); i++ )
if( !i || a[i] != a[i-1] )
a[j++] = a[i] ;
// a[0] ~ a[j-1] 所有a中不重複的數
return a.begin() + j ; // 返回的是最後一個元素的後一個位置
}