有些資料本身很大, 自身無法作為陣列的下標儲存對應的屬性。
如果這時只是需要這堆資料的相對屬性, 那麼可以對其進行離散化處理!
離散化:當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。
例如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],b[n]是序列a[n]的乙個副本,則對應以上三步為:
sort
(sub_a,sub_a+n);
int size=
unique
(sub_a,sub_a+n)-sub_a;
//size為離散化後元素個數
for
(i=0
;ia[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離散化大大減少了**量且結構相當清晰。
資料離散化處理
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,...
資料離散化處理
離散化處理有幾個方法 方法一 適用於所有情況 sort unique lower bound 三段式 關於這幾個函式請見我的另一篇部落格 1 申請兩個陣列num和numcopy 這個陣列是num的副本 2 利用unique函式對num陣列進行去重 3 利用lower bound函式獲得numcopy...
資料離散化處理
有時候,我們需要使用陣列下標來維護某些資料結構 例如並查集 但如果資料範圍太大我們開不了這麼大的陣列,這時候,我們就要將資料進行離散化。例如資料我們可以根據相對大小關係67542347 75331434 87433476 99844531來開乙個新陣列編號,二分查詢在新陣列裡的編號。如b 1 675...