1. 程式人生 > >c++離散化處理大範圍和重複資料

c++離散化處理大範圍和重複資料

關於離散化

  有些新手可能會問:離散化是什麼?離散化就是將無限空間中有限的個體對映到有限的空間裡去。

  上面的定義肯定會有人看不懂(其實我剛開始學的時候也看不懂)

  用我自己的話來說,就是在不改變資料的相對大小的條件下,對資料進行相應的壓縮

  可能還是有人看不懂,沒關係,我們來看一個例子,順便來講一下離散化的基本操作:

  現有一個數組: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 }
View Code

&n