關於離散化的小認知

2022-05-01 11:57:12 字數 1515 閱讀 2107

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

有些資料本身很大, 自身無法作為陣列的下標儲存對應的屬性。

如果這時只是需要這堆資料的相對屬性, 那麼可以對其進行離散化處理!

離散化:當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。

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.

32434234,32434234,43324556,8384733,98998988

去重後給予其對應的索引:0,0,1,2,3分別對應每個數,就可以簡化很多操作,減少了很多不必要的資源開銷。

除了對於較大整數需要使用離散化之外,對於一些需要使用整型資料結構,但給出的資料卻是小數的也可以使用離散化,將其索引為整數就可以了。

那麼可以總結出離散化的步驟:

1、排序

2、去重

3、索引

為了簡化**,我們採用stl演算法離散化:

int a[n], b[n], sub[n]; //

a[n]是即將被離散化的陣列,b[n]是a[n]的副本,sub用於排序去重後提供離散化後的值

sort(sub, sub +n);

int size = unique(sub, sub + n) -sub;

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

a[i] = lower_bound(sub, sub + size, a[i]) - sub; //

即a[i]為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、通過離散後的值查詢離散前的值:

若離散後的值為x,那麼對應的離散前的值為sub[x];

2、通過離散前的下標查詢離散後的值:

若離散前的下標為i,那麼對應的離散後的值為a[i];

3、通過離散前的值查詢離散後的值:

如果沒有相應的儲存的話,首先要確定y在sub中的位置,或者在b中的位置,前者可以使用pos = lower_bound(sub, sub+size, y) - sub。那麼pos即為下標,通過第二步再查詢就好了。

下面附上關於unique函式的簡單應用。

關於離散化的一點思考

其實,本蒟蒻自學的時候,對於離散化就沒有怎麼學習過,qaq,當初那道題估計是資料太水了讓我水過去了的吧?好,言歸正傳,離散化是什麼呢?在我看來,離散化就是對資料的一種處理,把資料範圍很大的數處理 當然,前提是資料沒那麼多 每個陣列元素裡儲存乙個大數,然後直接對陣列進行處理。先介紹常規的方法 不用un...

關於CSS clear both的認知

按照css規範,浮動元素 floats 會被移出文件流,不會影響到塊狀盒子的布局而只會影響內聯盒子 通常是文字 的排列。因此當其高度超出包含容器時,一般父容器不會自動伸長以閉合浮動元素。但是有時我們卻需要這種自動閉合行為,具體如何處理呢?在進行浮動布局時,大多數人都深知,在必要的地方進行浮動清理 例...

資料的離散化

有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需要這堆資料的相對屬性,那麼可以對其進行離散化處理!離散化 當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。例如 9 1 0 5 4 與 5 2 1 4 3 的逆序對個數相同。設有4個數 1234567 12...