离散化这个概念困扰了我很久,我就是不太能够理解离散化到底是在干什么。这几天又好好看了一下。,总的来说,就是将一串很长或者说有的元素很大的数列进行“压缩”,形成类似一种映射关系。
举个例子,如果题目要求每个数的大小不超过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]的第一个元素的位置,即前面相同元素的顺序。完成离散化