離散化的方法

2021-08-28 16:35:31 字數 1268 閱讀 7786

離散化,就是把一些很離散的點給重新分配。

舉個例子,如果乙個座標軸很長(>1e10),給你1e4個座標,詢問某乙個點,座標比它小的點有多少。

很容易就知道,對於1e4個點,我們不必把他們在座標軸上的位置都表示出來,因為我們比較有多少比它小的話,只需要知道他們之間的相對大小就可以,而不是絕對大小,這,就需要離散化。

而離散化又分為兩種,分為的兩種是對於重複元素來劃分的。第一種是重複元素離散化後的數字相同,第二種就是不同。

其實就是用乙個輔助的陣列把你要離散的所有資料存下來。

然後排序,排序是為了後面的二分。

去重,因為我們要保證相同的元素離散化後數字相同。

再用二分把離散化後的數字放回原陣列。

**如下。

#include// 標頭檔案 

//n 原陣列大小 num 原陣列中的元素 lsh 離散化的陣列 cnt 離散化後的陣列大小

int lsh[maxn] , cnt , num[maxn] , n;

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

sort(lsh+1 , lsh+n+1);

cnt = unique(lsh+1 , lsh+n+1) - lsh - 1;

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

num[i] = lower_bound(lsh+1 , lsh+cnt+1 , num[i]) - lsh;

1.去重並不是把陣列中的元素刪去,而是重複的部分元素在陣列末尾,去重之後陣列的大小要減一

2.二分的時候,注意二分的區間範圍,一定是離散化後的區間

3.如果需要多個陣列同時離散化,那就把這些陣列中的數都用陣列存下來

第二種方式其實就是排序之後,列舉著放回原陣列

用乙個結構體存下原數和位置,按照原數排序

我結構體裡面寫了個過載,也可以寫乙個比較函式

最後離散化後數在rank裡面

#includestruct node 

};node num[maxn];

int rank[maxn] , n;

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

sort(num+1 , num+n+1);

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

rank[num[i].id] = i;

先送一道有離散化的題:luogu1955

很水的一道題,解析在這:noi2015程式自動分析

用的最多的是第一種方法,第二種方法感覺比較陌生,不過還是需要學的。

離散化的方法

總結有如下幾個步驟 1.拷貝原陣列 2.將拷貝的陣列排序 3.利用unique 對拷貝陣列去重,並記錄不重複元素 4.利用lower bound 離散化 注 唯一需要注意的是下標究竟從幾開始 離散化後的值可以理解為是在這個陣列中第幾大的值,所以如果要查詢離散化的值在原陣列中對應哪個數,我們直接查詢 ...

離散化方法

個人筆記,僅供複習 2.適用範圍 除了對於較大整數需要使用離散化之外,對於一些需要使用整型資料結構,但給出的資料卻是小數的也可以使用離散化,將其索引為整數就可以了。3.一般步奏 4.例題 uva12171 uva12171 sculpture rujia liu include include in...

常用特徵離散化方法

1規定劃分區間的引數,取定長的間隔將特徵放入不同的箱子中,這種方法對異常點比較敏感。2 根據頻率劃分箱子,會出現特徵相同卻不在乙個箱子中的情況,需要在劃分完成後進行微調。先對特徵值進行sort,然後評估分割點,劃分或者合併 3 1r方法 將前面的m個例項放入箱子中如果後面例項放入箱子時,比對當前例項...