离散化数据学习【模板】

参考博客: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])的操作了
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值