版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
什么是离散化
简单来说就是把很大的数字用一个很小的数字来代替,中间建立映射关系。
数据离散化的目的是因为数据的范围过大, 把其一一映射在较小的范围,成为数据离散化。
当只需要它们的相对大小关系时,可以进行离散化来节约空间复杂度。
例子:
给第区间[999999,10000000000000]的每一个数+1;
我们不可能开那么大的数组,那我们就用1映射到999999,2映射到10000000000000
此时我们就把a[1]+1,a[2]+1。当区间询问时,就返回去找到原来的数,d
什么时候用到离散化
当数据的组数很小,而数据的大小很大的时候
例如下图,只有n组数据,但是每个数都很大,我们就可以用
模板
仅供参考
vector<int> v;
int a[1e5+5];
int getid(int x)
{
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scnnf("%d",a[i]);
v.push_back(a[i]);
}
sort(v.begin(),v.end());
v.erase( unique(v.begin(),v.end()) , v.end());//去重
for(int i=1;i<=n;i++)
cout<<getid(a[i])<<endl;
//现在对a[i]的操作就转换为了对getid(a[i])的操作了
}