離散化主要是通過建立乙個對映,將分散的元素的位置對映成連續的位置以節約空間。說明:x為題目要進行操作的陣列元素的下標,y為經過離散化後的下標。
原理:
若不離散化,則針對該例需要開乙個大小為9000000的陣列儲存操作結果!
通過建立乙個對映陣列來儲存所有要進行操作的下標x,然後將其排序去重,每次操作x位置元素時用二分法查詢x在對映陣列中的位置y。操作x位置元素改為操作y位置元素。
排序是為了方便二分查詢,排序後去重比較方便,去重是為了建立x與y的一一對映,不去重則會導致乙個x可以對應多個y(可以不去重,每次查詢x只返回特定的y就行了,但是這樣時間複雜度更慢,所以最好還是去重)。
離散化後只需要開大小為x的個數的陣列了,針對本例我們只需開乙個大小為5的陣列即可。
離散化也有缺點,就是它排序去重需要nlogn的時間,每次操作要用logn倍直接操作的時間。
1.模板題:acwing103.電影、acwing 802. 區間和//題目要求對輸入位置的元素進行加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.利用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個點,我們不必把他們在座標軸上的位置都表示出來,因為我們比較有多少比它小的話,只需要知道他們之間的相對大小就可以,而不是絕對大小,這,就需要離...