資料離散化處理

2022-07-31 09:45:10 字數 1189 閱讀 4700

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如:

原資料:1,999,100000,15;處理後:1,3,4,2;

原資料:,,;

處理後:,,;

用法:

很多演算法的複雜度與資料中的最大值有關,比如樹狀陣列和純用陣列實現的一對一標記。時常會遇到這種情況:資料的範圍非常大或者其中含有負數,但資料本身的個數並不是很多(遠小於資料範圍)。在這種情況下,如果每個資料元素的具體值並不重要,重要的是他們之間的大小關係的話,我們可以先對這些資料進行離散化,使資料中的最大值盡可能小且保證所有資料都是正數。

例如,有這樣乙個長為5的序列:102131511,123,9813186,-611,55。其中有非常大的數以及負數,會給許多演算法的實現帶來困擾,我們可以把這個序列離散化,使它變成這樣:5,3,4,1,2。各個元素間的大小關係沒有任何改變,但資料的範圍一下子就變得很舒服了。

離散化的原理和實現都很簡單。為了確保不出錯且盡可能地提高效率,我們希望離散化能實現以下幾種功能:1.保證離散化後的資料非負且盡可能的小2.離散化後各資料項之間的大小關係不變,原本相等的也要保持相等。由此,找出資料項在原序列中從小到大排第幾就是離散化的關鍵。

可以通過下面的方法以o(nlong)的時間複雜度完成離散化,n為序列長度。

做法:對原序列進行排序,使其按公升序排列。

去掉序列中重複的元素。

此時序列中各位置的值和位置的序號就是離散化的對映方式。

例如:對於序列105,35,35,79,-7,排序並去重後變為-7,35,79,105,由此就得到了對應關係-7->1, 35->2, 79->3, 105->4。

**:

int

n, a[maxn], t[maxn];

//這裡以下標1為序列的起點,一般情況下從0開始也可以

for(int i = 1;i <= n;i++)

//下面使用了stl中的sort(排序),unique(去重),lower_bound(查詢)函式

sort(t + 1, t + n + 1);//

排序int m = unique(t + 1, t + 1 + n) - t - 1;//

去重,並獲得去重後的長度m

for(int i = 1;i <= n;i++)

資料離散化處理

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 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...