常用技巧 離散化

2022-08-16 08:54:12 字數 1114 閱讀 1092

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

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

例如,有這樣乙個長為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++)

常用技巧 離散化

這個技巧比較常用,當處理資料比較大,但是又不是很需要去關心資料的具體數值,而只需要去關心相對位置時會很有用 因為很多題目的資料範圍會很大,但給的資料點卻很少,或者這個資料範圍是連續的時候 比如 2000000 200 600 4000 600 2000000這種輸入,要對其進行離散化,先對其進行排序...

技巧 離散化

模板 include include include using namespace std vectorid int main sort id.begin id.end 為二分搜尋排序 去重讓每乙個值都是單一的 id.erase unique id.begin id.end id.end 把值改變...

技巧 離散化

離散化作為一種常見的技巧,可以有效地降低時間和空間複雜度.本文介紹兩種離散化模板.此外,離散化有一些坑點,在處理染色問題的端點方面不能直接套用模板.這種題應該具體分析.include include using namespace std const int n 1e1 5 int t n a n ...