离散化数据学习【模板】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40733911/article/details/99579169

参考博客:http://www.matrix67.com/blog/archives/108

什么是离散化

简单来说就是把很大的数字用一个很小的数字来代替,中间建立映射关系。
数据离散化的目的是因为数据的范围过大, 把其一一映射在较小的范围,成为数据离散化。
当只需要它们的相对大小关系时,可以进行离散化来节约空间复杂度。
例子:
给第区间[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])的操作了
}

猜你喜欢

转载自blog.csdn.net/qq_40733911/article/details/99579169