離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如:原資料:1,999,100000,15;處理後:1,3,4,2;原資料:,,;處理後:,,;例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,若資料的總量相對較少時,就可以對其進行離散化處理
離散化處理需要用到的stl函式有3個:sort(),unique(),lower_bound()
1.sort()不再作贅述
2.unique(first, last)用於元素去重
」刪除」[first, last) 序列中所有相鄰的重複元素(只保留乙個)。此處的刪除,並不是真的刪除,而是指重複元素的位置被不重複的元素給占領了,即不斷地把不重複的元素移到前面來
由於它」刪除」的是相鄰的重複元素,所以在使用unique函式之前,一般都會將目標序列進行排序。同時unique()會返回去重後序列中的最後乙個元素的下乙個元素(相當於去重後序列的ar.end() ),那麼就可以算出去重後序列的長度,即返回值 - 序列首位址3.1下界函式:lower_bound(first , last , v)找到並返回 非降序列 [first,last) 中第乙個大於等於v的元素的位址
3.2上界函式:lower_bound(first , last , v)
找到並返回 非降序列 [first,last) 中第乙個大於v的元素的位址
;//先對b進行排序
int m=
unique
(b+1
,b+n+1)
-(b+1)
;//去重,同時返回值-首位址得到去重後序列的長度
//此時 b中的值 離散化的對映就是其 下標
//若要查詢a中某個值的對映,可對b利用lower_bound()進行二分查詢,如下
for(
int i=
1;i<=n;i++
) a[i]
=lower_bound
(b+1
,b+m+
1,a[i]
)-b;
//得到a[i]在b中的下標,即為其對映
資料離散化處理
離散化處理有幾個方法 方法一 適用於所有情況 sort unique lower bound 三段式 關於這幾個函式請見我的另一篇部落格 1 申請兩個陣列num和numcopy 這個陣列是num的副本 2 利用unique函式對num陣列進行去重 3 利用lower bound函式獲得numcopy...
資料離散化處理
有時候,我們需要使用陣列下標來維護某些資料結構 例如並查集 但如果資料範圍太大我們開不了這麼大的陣列,這時候,我們就要將資料進行離散化。例如資料我們可以根據相對大小關係67542347 75331434 87433476 99844531來開乙個新陣列編號,二分查詢在新陣列裡的編號。如b 1 675...
資料離散化處理
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 用法 很多演算法的複雜度與資料中的最大值有關,比如樹狀陣列和純用陣...