基礎演算法 離散化

2021-10-23 08:37:10 字數 1584 閱讀 2030

離散化主要是通過建立乙個對映,將分散的元素的位置對映成連續的位置以節約空間。

說明:x為題目要進行操作的陣列元素的下標,y為經過離散化後的下標。

原理:

若不離散化,則針對該例需要開乙個大小為9000000的陣列儲存操作結果!

通過建立乙個對映陣列來儲存所有要進行操作的下標x,然後將其排序去重,每次操作x位置元素時用二分法查詢x在對映陣列中的位置y。操作x位置元素改為操作y位置元素。

排序是為了方便二分查詢,排序後去重比較方便,去重是為了建立x與y的一一對映,不去重則會導致乙個x可以對應多個y(可以不去重,每次查詢x只返回特定的y就行了,但是這樣時間複雜度更慢,所以最好還是去重)。

離散化後只需要開大小為x的個數的陣列了,針對本例我們只需開乙個大小為5的陣列即可。

離散化也有缺點,就是它排序去重需要nlogn的時間,每次操作要用logn倍直接操作的時間。

//題目要求對輸入位置的元素進行加1操作,操作結束後輸出按順序輸出所有輸入位置的結果(輸入位置可能重複)

#include

#include

#include

using

namespace std;

const

int n =

2e5+5;

int n, a[n]

, cnt[n]

;vector<

int>alls;

//二分實現原位置x對映到對映位置y

intfind

(int x)

return l;

}int

main()

sort

(alls.

begin()

, alls.

end())

;//排序

alls.

erase

(unique

(alls.

begin()

, alls.

end())

, alls.

end())

;//去重

for(

int i =

0; i < n; i++

) cnt[

find

(a[i])]

++;//操作原位置對映位置的結果陣列

for(

int i =

0; i < n; i++

) cout << cnt[

find

(a[i])]

<<

' ';

//輸出原位置對映位置的結果陣列

return0;

}

1.模板題:acwing103.電影、acwing 802. 區間和

1.利用map和unordered_map,使用之前都要匯入相應標頭檔案。

ps:持續更新中~

基礎演算法6 離散化

問題引入 a i 1 3 100 2000 50000 對映到 0 1 2 3 4 解決問題1 a中可能重複元素 解決問題2 如何快速算出x離散化後的值 n個新增操作,m個詢問操作 int n,m a陣列存數,s陣列存字首和 int a n s n 所有會用到的元素下標 vectoralls 新增操...

基礎演算法學習 離散化

題目給出範圍很大但資料數量很少的一組資料,通過離散化將大的下標的值賦值給新的較小的連續的下標,從而講乙個範圍很大的資料合集裝進乙個小的容器中。vecrotalls 儲存所有待離散化的值 sort alls.begin alls.end 將alls裡的所有待離散化的值總小到大排序 alls.erase...

演算法筆記 離散化

離散化,就是把一些很離散的點給重新分配。舉個例子,如果乙個座標軸很長 1e10 給你1e4個座標,詢問某乙個點,座標比它小的點有多少。很容易就知道,對於1e4個點,我們不必把他們在座標軸上的位置都表示出來,因為我們比較有多少比它小的話,只需要知道他們之間的相對大小就可以,而不是絕對大小,這,就需要離...