1. 程式人生 > >資料離散化模板(用STL實現)

資料離散化模板(用STL實現)

最近在練習一道提的時候,資料比較大,總過不了,後來瞭解得需要用離散化,對視拋棄沒有用到資料只存取有用的資料,

並且用簡單好記的東西去儲存,例如:

有些資料本身很大, 自身無法作為陣列的下標儲存對應的屬性。

如果這時只是需要這堆資料的相對屬性, 那麼可以對其進行離散化處理!

離散化:當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。

例如

9 1 0 5 4 與 5 2 1 4 3 的逆序對個數相同。
設有4個數:
1234567、123456789、12345678、123456
排序:123456<1234567<12345678<123456789
           =>     1     <        2       <        3       <        4
那麼這4個數可以表示成:2、4、3、1

使用STL演算法離散化:
思路:先排序,再刪除重複元素,然後就是索引元素離散化後對應的值。
假定待離散化的序列為a[n],stu_a[n]是序列a[n]的一個副本,則對應以上三步為:

sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size為離散化後元素個數
for(i=0;i<n;i++)
a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k為b[i]經離散化後對應的值

對於第3步,若離散化後序列為0, 1, 2, ..., size - 1則用lower_bound,從1, 2, 3, ..., size則用upper_bound,其中lower_bound返回第1個不小於b[i]的值的指標,而upper_bound返回第1個大於b[i]的值的指標,當然在這個題中也可以用lower_bound然後再加1得到與upper_bound相同結果,兩者都是針對以排好序列。使用STL離散化大大減少了程式碼量且結構相當清晰。