c++離散化處理大範圍和重複資料
阿新 • • 發佈:2020-05-17
關於離散化
有些新手可能會問:離散化是什麼?離散化就是將無限空間中有限的個體對映到有限的空間裡去。
上面的定義肯定會有人看不懂(其實我剛開始學的時候也看不懂)
用我自己的話來說,就是在不改變資料的相對大小的條件下,對資料進行相應的壓縮
可能還是有人看不懂,沒關係,我們來看一個例子,順便來講一下離散化的基本操作:
現有一個數組:1,100,2367,562,364737,19,1974832947,100,562,2367
如果按照正常的方法,該開1974832947的空間,但是經過離散化後,就不需要
那麼step 1:排序
用上面的例子來說,就是將上面的資料排序並去重,得到下面這組資料:
1,19,100,100,562,562,2367,2367,364737,1974832947
然後step 2:通過unique去重使大小與下標對應,並得到去重後的長度,得到下面這組資料:
1,19,100,562,2367,364737,1974832947
接著step 3:通過lower_bound算出離散化後的排列,得到下面這組資料:
1,2,3,4,5,6,7
那麼這裡就很尷尬了,這組資料無法應用於初始資料
所以在開始,我們多定義1個數組,來記錄初始情況下的資料,再用step 3與其進行對應。
最終得到答案:1,3,5,4,6,2,7,3,4,5
下面給出模板:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[100005],b[100005],n; 4 int main() 5 { 6 ios::sync_with_stdio(false); 7 cin.tie(0); 8 cin>>n; 9 for(int i=1;i<=n;i++) 10 { 11 cin>>a[i]; 12 b[i]=a[i]; 13 } 14 sort(a+1,a+n+1); 15 int len=unique(a+1,a+n+1)-a-1; 16 for(int i=1;i<=n;i++) 17 b[i]=lower_bound(a+1,a+len+1,b[i])-a; 18 for(int i=1;i<=n;i++) cout<<b[i]<<" "; 19 return 0; 20 }
&n