离散化概要
离散化(Discretization)是一种数据处理技术,用于将连续的数据(如实数或非常大的整数)映射到有限的离散值域中,从而提高算法的时空效率。离散化在处理数组元素值域较大、负数或小数时,尤其在值域范围远大于数组大小的情况下,能够使得许多依赖于数组下标的算法和数据结构得以实现。通过离散化,可以将元素值转换为相对较小的整数,使得这些元素可以更有效地存储和操作。例如原数组的范围是[1,1e9],而数组大小仅为1e5,那么说明元素值的“种类数”最多也就1e5种,从而可以利用一个数组(即离散化数组)来表示某个元素值的排名(即第几小)现值域的压缩,将原数组的元素值作为下标来处理。
离散化的原理
离散化的核心思想是将原数组中的元素值映射到一个较小的离散值域中,使得原数组的元素值能够作为下标来处理。这种映射可以通过以下步骤实现:
- 收集所有元素值并排序:将原数组中的所有元素值提取出来并进行排序。
- 去重:对排序后的元素值进行去重操作,以确保每个值在新的离散值域中唯一对应一个下标。
- 建立映射关系:为每个去重后的元素值分配一个唯一的整数下标,通常是其在排序后的位置。
- 替换原数组:使用新分配的整数下标替换原数组中的元素值。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+4;
int n,num; //n个数据
vector<int> L; //原始数据
int a[N]; //离散化数组
int getidx(int x)
{
return lower_bound(L.begin(),L.end(),x)-L.begin(); //元素下标计算
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i){
cin>>num;
L.push_back(num);
}
sort(L.begin(),L.end());
L.erase(unique(L.begin(),L.end()),L.end()); //去重
for(int i=0;i<L.size();++i)
{
a[i]=getidx(L[i]);
cout<<a[i]<<" "<<L[i]<<endl;
}
return 0;
}