离散化(会继续更新)

离散化这个概念困扰了我很久,我就是不太能够理解离散化到底是在干什么。这几天又好好看了一下。,总的来说,就是将一串很长或者说有的元素很大的数列进行“压缩”,形成类似一种映射关系。
举个例子,如果题目要求每个数的大小不超过1e9,但是如果开1e9的数组直接进行操作的话,可能会MLE,在有些时候我们不需要知道每个元素的具体值的大小,只需要知道他们的相对大小,这样就可以进行离散化。

比如,{4,139,78,66}就可以离散化成{1,4,3,2}

先介绍一种方式

///离散化
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int a[N],t[N];
int n,m;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],t[i]=a[i];
    sort(t+1,t+n+1);///去重之前先进行排序
    m=unique(t+1,t+n+1)-t-1;///去重并返回不重复的元素个数
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(t+1,t+m+1,a[i])-t;
}

顺便说说这里的unique()函数,unique()函数有“去重”功能,但不是真正的将重复的元素去除,而是将重复的元素压到数列的后面去。与此同时,unique()函数还会返回一个不重复元素的个数。

  for(int i=1;i<=n;i++)
        a[i]=lower_bound(t+1,t+m+1,a[i])-t;

上面这条语句,对于前m个元素,a[i]=lower_bound(t+1,t+m+1,a[i])-t 等价于a[i]=i,而对于后面的重复元素,使用lower_bound()函数,找到小于等于a[i]的第一个元素的位置,即前面相同元素的顺序。完成离散化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值